【问题标题】:Doing "group by" in django but still retaining complete object在 django 中进行“分组”,但仍保留完整的对象
【发布时间】:2014-07-25 02:03:21
【问题描述】:

我想在 Django 中进行 GROUP BY。我在 Stack Overflow 上看到了推荐的答案:

Member.objects.values('designation').annotate(dcount=Count('designation'))

这可行,但问题是您得到的是ValuesQuerySet 而不是QuerySet,因此查询集没有给我完整的对象,而只是给我特定的字段。我想得到完整的对象。

当然,既然我们在分组,我们需要选择从每个组中取出哪个对象;我想要一种指定对象的方法(例如,在某个字段中取最大值等)

有人知道我该怎么做吗?

【问题讨论】:

  • 几年前我在博客上写过一个类似的问题:blog.roseman.org.uk/2010/08/14/getting-related-item-aggregate - 这对你有帮助吗?
  • 使用原始查询怎么样?我发现在做更复杂的事情时,最好跳过 ORM。
  • @DanielRoseman - 你应该用你的建议来回答这个问题,而不是仅仅发表评论。您可能希望将您博客文章的摘录放在答案中。
  • @DanielRoseman 这能行吗? Document.objects.filter(id__in=Document.objects.order_by('title').distinct('title')).order_by('anything_you_want') ?试试看。

标签: python sql django orm


【解决方案1】:

如果您愿意进行两个查询,您可以执行以下操作:

dcounts = Member.objects.values('id', 'designation').annotate(dcount=Count('designation')).order_by('-dcount')
member = Member.objects.get(id=dcounts.first()['id'])

如果您想要dcount 的前五个对象,您可以执行以下操作:

ids = [dcount['id'] for dcount in dcounts[:5]]
members = Member.objects.filter(id__in=ids)

【讨论】:

    【解决方案2】:

    听起来您不一定需要 GROUP BY,而只是想将您的选择限制为每个字段一个项目(例如,某个字段的 MAX 值)。

    你可以尝试按字段获取不同的对象,例如

    在 Postgres 中

    Member.objects.order_by('designation').distinct('designation')

    在任何其他数据库中

    Member.objects.distinct('designation')

    https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.distinct

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-02
      • 1970-01-01
      • 1970-01-01
      • 2013-04-28
      • 1970-01-01
      • 2021-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多