我想在 Django QuerySet 中执行与以下查询等效的操作:
SELECT address, city, state, zip, COUNT(*)
FROM entries
GROUP BY address, city, state, zip
HAVING COUNT(*) > 5
不幸的是,Django 的 Count() 聚合函数需要一个字段,但我没有计算任何一个单独的字段。另外,我不能将“*”用作字段。
是使用 .raw() 执行此操作的唯一方法吗?
最佳答案
实际上,尽管 count()
在一般情况下是正确的,但它不适用于 GROUP BY
- 它返回单个值。这种情况最好通过以下方式处理:
qs = Entries.objects.values('address', 'city', 'state', 'zip').annotate(entry_count=Count('id'))
这应该计算 ID 的数量,因此计算每个组中唯一行的数量。
对于 having
部分,对注解进行过滤即可:
qs = qs.filter(entry_count__gt=5)
关于python - 如何在 Django 中使用 GROUP BY 计数(*),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20406028/