django如何动态地分组ManyToMany关系

时间:2016-11-14 01:36:37

标签: python django django-models django-views

我认为这是一个简单的要求,但我一直在靠墙打我的头,而且我没有更聪明。

我正在使用django 1.10。我想要做的是获取我的家庭成员分组的成员列表

模型看起来像这样:

class Family(models.Model):
    family_name = models.CharField(max_length=200)

class Member(models.Model):
    name = models.OneToOneField(User)
    family = models.ManyToManyField(Family,blank=True,related_name='members')

所以我可以设置我的观点

members = Member.objects.order_by('family')

members = Family.objects.order_by('family_name')

这显然是我的会员或我的家人,但不是两者。如何让这个成员名称和他们的家庭成员,然后按照它分组?

我正在寻找的输出示例是:

家庭1

  • 会员1
  • 会员2

家庭2

  • 会员1
  • 会员3

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

第一个出了什么问题?如果您想按家人的name订购,请执行:

members = Member.objects.order_by('family__family_name')

这些成员都可以通过.family获得他们的家人。如果要在循环浏览这些成员并访问其系列时保存数据库查询,可以添加select_related

members = Member.objects.order_by('family__family_name').select_related('family')

另一方面,如果你真的想要家庭,然后循环其成员,请执行:

families = Family.objects.order_by('family_name').prefetch_related('members')
for fam in families:
    // do sth. with family
    for mem in fam.members.all():
        // do sth. with member

prefetch_related无论有多少个家庭或成员,都只需要2个db查询。