简体   繁体   English

django如何动态地对ManyToMany关系进行分组

[英]django how to group on ManyToMany relationship dynamically

I have what I believe is a simple request but I have been beating my head against a wall and I am not getting any smarter for it. 我有一个简单的请求,但是我一直在碰壁,但我并没有因此而变得更聪明。

I am using django 1.10. 我正在使用Django 1.10。 What I am trying to do is get a list of my members grouped by my family field 我要做的是获取按家庭领域分组的成员列表

The models look like this: 这些模型如下所示:

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')

So i can set my view to use 所以我可以设置我的观点来使用

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

or 要么

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

This obviously holds my members or my families but not both. 这显然可以容纳我的成员或家人,但不能同时容纳这两个成员。 How would i get this to have both the member name and their family and then group by it? 我将如何获得会员名称和他们的家人,然后按它分组?

An Example of the output i am looking for is: 我正在寻找的输出示例是:

Family 1 家庭1

  • Member 1 成员1
  • Member 2 成员2

Family 2 家庭2

  • Member 1 成员1
  • Member 3 成员3

Any help would be appreciated. 任何帮助,将不胜感激。

What's wrong with the first one? 第一个怎么了? If you want to order it by the family's name , do: 如果要按家人的name订购,请执行以下操作:

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

These members all have their family available via .family . 这些成员都可以通过.family获得.family If you want to save db queries when you are looping through these members and access their families, you can add a select_related : 如果要在遍历这些成员并访问它们的族时保存数据库查询,则可以添加select_related

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

On the other hand, if you really want families and then loop through their members, do: 另一方面,如果您真的想要家庭,然后与他们的成员进行交流,请执行以下操作:

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

The prefetch_related will make this run with only 2 db queries, no matter how many families or members. 无论有多少族或成员, prefetch_related都将仅使用2个数据库查询来运行该查询。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM