【问题标题】:How to query a many to many relationship in Django如何在 Django 中查询多对多关系
【发布时间】:2011-11-13 09:16:56
【问题描述】:

我有一份不同组织类型下的完整组织列表。我有一个包含姓名、电话等的表,然后是另一个表,其 id 固定为组织类型。然后是一个包含多对多关系的表,因为一个组织可以有许多不同的组织类型。

我想做的是按字母顺序列出属于每种组织类型的所有俱乐部。

我不确定这是否需要在views.py 中完成,或者是否应该在我的模板文件中完成。

这是我的模型:

class ClubType(models.Model):
    name = models.CharField(max_length = 250)

    def __unicode__(self):
        return self.name

class Club(models.Model):

    name = models.CharField(max_length = 250,
            verbose_name = "Club or Organization Name",
            )
    created_date = models.DateTimeField(
            auto_now_add = True,
            )
    updated_date = models.DateTimeField(
            auto_now = True,
            auto_now_add = True,
            )
    club_type = models.ManyToManyField(ClubType)
    username = models.CharField(max_length = 100,
            blank = True, null = True
            )
    contact_name = models.CharField(max_length = 250,
            blank = True, null = True,
            )
    phone_number = models.CharField(max_length = 250,
            blank = True, null = True,
            )

    def __unicode__(self):
        return self.name

    class Meta:
        ordering = ('name', )

我是 python 和 Django 的菜鸟,所以任何帮助都将不胜感激。

谢谢

【问题讨论】:

  • 你能用一些代码更新这个问题吗?至少模型。您是否为关系使用了 ManyToManyField ?
  • 我赞成那个议案,一些代码会很好,否则很难回答这个问题。
  • models.py 中您提到的那些表的代码。

标签: python django django-models django-templates django-views


【解决方案1】:

基本上你需要做以下步骤:

  1. 获取不同的俱乐部类型
  2. 对于每个俱乐部类型,选择包含该类型的俱乐部(另请参阅this
  3. 按字母顺序对 #2 中的选择进行排序

有很多方法可以实现这一点,我不建议将此逻辑放入模板中,因为在视图中表达其背后的逻辑可能更容易(或者如果您以后冒险,则在 custom Manager在你的 Django 生活中)

一个例子(警告:未经测试的代码):

# step 1
club_types = ClubTypes.objects.distinct()

# step 2 & #3
club_sets = []
for current_club_type in club_types:
    cset = Clubs.objects.filter(club_type__id=current_club_type.pk).order_by('name')
    club_sets.append((current_club_type, cset))

最后剩下的是俱乐部类型列表的列表,每个列表都按以下形式的名称排序:

[ (clubtype1, [ club1, club2, ...]), (clubtype2, [ club2, club8, ...]), ... ]

【讨论】:

  • 我的模板文件中的逻辑是什么样的?我必须在那里做一个forloop吗?这看起来像是在创建一个大数组,对吗?
  • 假设您想将信息显示为一个俱乐部类型列表,每个俱乐部都有一个俱乐部子列表,那么您只需要一个嵌套的 2 个 for 循环来遍历 club_sets 结果。更新了答案,并举例说明了 club_sets 中的数据将是什么样子。
  • 这很有效,除了我希望能够在所有俱乐部类型的每个列表上方显示俱乐部类型名称
  • 好的,记住俱乐部类型也很简单。该示例已更新。现在你得到一个形式为 (clubtype, clubs) 的元组列表。
猜你喜欢
  • 2013-11-22
  • 2017-02-02
  • 1970-01-01
  • 2021-03-07
  • 1970-01-01
  • 2015-10-26
  • 1970-01-01
  • 2014-07-14
相关资源
最近更新 更多