如何在Django中查询多对多关系

big*_*801 2 python django django-templates django-models django-views

我有一个包含不同组织类型的组织列表。我有一个表,其中包含姓名、电话等信息……然后还有另一个表,其中的 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', )
Run Code Online (Sandbox Code Playgroud)

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

谢谢

awe*_*omo 5

基本上您需要执行以下步骤:

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

有很多方法可以实现这一点,我不建议将此逻辑放入模板中,因为一个简单的事实是,在视图中表达其背后的逻辑可能更容易(或者在自定义管理器中,如果您在 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))
Run Code Online (Sandbox Code Playgroud)

最后剩下的是俱乐部类型列表的列表,每个列表均按名称排序,格式如下:

[(俱乐部类型1,[俱乐部1,俱乐部2,...]),(俱乐部类型2,[俱乐部2,俱乐部8,...]),...]