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

kar*_*ikr 13 python django django-queryset

我有以下型号:

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

class UserExtendedProfile(CachedModel):

    company = models.ForeignKey(Company)
    user = models.ForeignKey(User)
Run Code Online (Sandbox Code Playgroud)

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

Company A
    User 1
    User 2

Company B
    User 3 
    user 4
Run Code Online (Sandbox Code Playgroud)

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

users = UserExtendedProfile.objects.values('company', 'user').order_by('company')
Run Code Online (Sandbox Code Playgroud)

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

[{'company': 1L, 'user': 17L}, {'company': 1L, 'user': 6L}, {'company': 2L, 'user': 15L}]
Run Code Online (Sandbox Code Playgroud)

有什么投入?

谢谢

and*_*fsp 12

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

users = UserExtendedProfile.objects.values('company', 'user').order_by('company', 'user')
Run Code Online (Sandbox Code Playgroud)

对于像这样的结构:

[{ company: [user1, user2, ] }, ]
Run Code Online (Sandbox Code Playgroud)

尝试使用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'])
Run Code Online (Sandbox Code Playgroud)

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

  • 2021年,有没有办法直接使用ORM来做到这一点? (4认同)

Fyd*_*ydo 6

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

它使您可以在模板内执行此操作。