在django中做“group by”但仍保留完整的对象

时间:2014-06-04 12:12:24

标签: python sql django orm

我想在Django中做一个GROUP BY。我在Stack Overflow上看到了建议:

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

这很有效,但问题是你得到ValuesQuerySet而不是QuerySet,所以查询集不会给我完整的对象,只会给我特定的字段。我想得到完整的物品。

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

有谁知道我怎么能这样做?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

听起来您不一定需要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