如何在django中使用GROUP BY计算(*)

时间:2013-12-05 16:57:16

标签: python django

我想在Django QuerySet中执行以下查询:

SELECT address, city, state, zip, COUNT(*)
FROM entries
GROUP BY address, city, state, zip
HAVING COUNT(*) > 5

不幸的是,Django的Count()聚合函数需要一个字段,但我不算任何一个字段。另外,我不能使用'*'作为字段。

使用.raw()是唯一的方法吗?

3 个答案:

答案 0 :(得分:3)

使用QuerySet.count()

  

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)

它将很好地工作。 *比其他领域要好。