【问题标题】:Filtering on the count with the Django ORM使用 Django ORM 过滤计数
【发布时间】:2011-04-17 06:19:58
【问题描述】:

我有一个查询,基本上是“计算 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

【问题讨论】:

  • 我可以,但相关的一点是有一个带有“类型”字段的“项目”模型......

标签: django orm aggregate


【解决方案1】:

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

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

【讨论】:

  • 是的 - 没错,但使用 type 而不是 group :) 它会返回类似: [{'type': u'X', 'type_count': 2}] -为什么我不早点说:)
  • 我认为你的意思是“类型”而不是“组”,当我在没有 __gt 部分的情况下这样做时它确实工作,但使用 __gt 部分它只是抛出“ dict 对象没有属性 type_count",这告诉我它正在尝试将其作为列访问...
  • 这很奇怪 - 我已经检查过了,它就像一个魅力。顺便提一句。当它说 dict 中没有 type_count attr 时,它表示聚合生成的 dict - 它不会像列一样尝试访问它。结果应该和我上面写的一样。在 django shell 中检查它以确保。
  • 是的,你是对的。我忘了它已经变成了字典并正在尝试属性查找。现在效果很好,谢谢!我会留下这个答案是正确的,因为我不能把它一分为二:(
【解决方案2】:

这是逻辑错误;)

type_count__gt=1 表示type_count > 1 所以如果count == 1 将不会显示:) 改用type_count__gte=1 - 这意味着type_count >= 1 :)

【讨论】:

  • 是的,但您说每个计数为 1 - 这就是为什么不显示任何内容的原因 :)
  • 有重复的类型,但所有的计数都是1。这是错误的,但我不知道为什么计数不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-03
  • 2018-11-06
  • 2014-09-24
  • 2021-10-01
  • 2016-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多