我想在Django中做一个GROUP BY。我在Stack Overflow上看到了建议:
的答案Member.objects.values('designation').annotate(dcount=Count('designation'))
这很有效,但问题是你得到ValuesQuerySet
而不是QuerySet
,所以查询集不会给我完整的对象,只会给我特定的字段。我想得到完整的物品。
当然,由于我们正在分组,我们需要选择从每个组中取出哪个对象;我想要一种方法来指定对象(例如,在某个字段中选择具有最大值的那个,等等)
有谁知道我怎么能这样做?
答案 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