我想在Django QuerySet中执行以下查询:
SELECT address, city, state, zip, COUNT(*)
FROM entries
GROUP BY address, city, state, zip
HAVING COUNT(*) > 5
不幸的是,Django的Count()聚合函数需要一个字段,但我不算任何一个字段。另外,我不能使用'*'作为字段。
使用.raw()是唯一的方法吗?
答案 0 :(得分:3)
count()
电话会在幕后执行SELECT COUNT(*)
,所以你 应始终使用count()
而不是加载所有记录 Python对象并在结果上调用len()
(除非你需要 无论如何将对象加载到内存中,在这种情况下len()
将是 快)。
答案 1 :(得分:3)
实际上,尽管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)
答案 2 :(得分:0)
queryset = Entries.objects.values('address', 'city', 'state', 'zip').annotate(cnt=Count('*')).filter(cnt__gt=5)
它将很好地工作。 *比其他领域要好。