按外键分组并显示相关项目 - Django

时间:2012-10-04 16:42:35

标签: python django django-queryset

我有以下型号:

class Company(CachedModel):
    name = models.CharField(max_length=255)

class UserExtendedProfile(CachedModel):

    company = models.ForeignKey(Company)
    user = models.ForeignKey(User)

我基本上需要获得公司订购的用户列表,如下所示:

Company A
    User 1
    User 2

Company B
    User 3 
    user 4

我尝试了一些东西,我能找到的最接近的是:

users = UserExtendedProfile.objects.values('company', 'user').order_by('company')

然而,这只会给我这样的结果:

[{'company': 1L, 'user': 17L}, {'company': 1L, 'user': 6L}, {'company': 2L, 'user': 15L}]

任何输入?

由于

2 个答案:

答案 0 :(得分:10)

您可以在order_by()方法上添加多个参数。因此,您可以在订单内订购。

users = UserExtendedProfile.objects.values('company', 'user').order_by('company', 'user')

对于如下结构:

[{ company: [user1, user2, ] }, ]

尝试使用 defaultdict

from collections import defaultdict 
users = defaultdict(list)
for result in UserExtendedProfile.objects.values('company', 'user').order_by('company', 'user'):
    users[result['company']].append(result['user'])

有了这个,你应该让用户得到你想要的结构。

答案 1 :(得分:4)

如果您只是为了显示目的而尝试完成此操作,请查看: https://docs.djangoproject.com/en/1.8/ref/templates/builtins/#regroup

它可以让你在模板中做到这一点。