使用Django ORM过滤计数

时间:2010-09-25 20:28:03

标签: django orm aggregate

我的查询基本上是“计算X类型的所有项目,并返回不止一次存在的项目及其计数”。现在我有这个:

Item.objects.annotate(type_count=models.Count("type")).filter(type_count__gt=1).order_by("-type_count")

但它不返回任何内容(所有项目的计数均为1)。我做错了什么?

理想情况下,它应该得到以下结果:

Type
----
1
1
2
3
3
3

并返回:

Type, Count
-----------
1     2
3     3

2 个答案:

答案 0 :(得分:16)

为了计算每种类型的出现次数,您必须按type字段进行分组。在Django中,这是通过使用values来获得该字段来完成的。所以,这应该有效:

Item.objects.values('group').annotate(
     type_count=models.Count("type")
).filter(type_count__gt=1).order_by("-type_count")

答案 1 :(得分:2)

这是逻辑错误;)

type_count__gt=1表示type_count > 1,如果count == 1将不会显示:) 请改用type_count__gte=1 - 表示type_count >= 1:)