【问题标题】:Group by Foreign Key and show related items - Django按外键分组并显示相关项目 - Django
【发布时间】:2012-09-25 18:18:03
【问题描述】:

我有以下型号:

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}]

任何输入?

谢谢

【问题讨论】:

  • 您的示例输出未汇总或计数。
  • 你为什么不尝试加入和原始查询
  • 我有 SQL 以原始查询方式工作,但只是想知道是否有办法通过 ORM 来完成。
  • 好的,听起来不错,如果有的话会尝试找到。
  • 写这个的 SQL 是什么?

标签: python django django-queryset


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您可以在 order_by() 方法上添加多个参数。因此,您可以在 orderings 中进行 ordering。

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

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

    【讨论】:

    • 但是,这只是表示结果集的另一种方式,我正在寻找类似:{ company: [user1, user2, ] }
    • 我已经用回复编辑了帖子。我不认为 django 有任何方法可以直接从查询集中执行此操作。但是我发布的回复应该有你的答案。问候
    • 太棒了..我只需要找到一种方法来获取对象而不是 id,我已经准备好了.. 谢谢 :)
    • 2021年,有没有办法直接使用ORM做到这一点?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2014-01-18
    • 2019-01-21
    • 2014-03-16
    • 2023-03-13
    • 2021-10-04
    • 2021-04-01
    相关资源
    最近更新 更多