【问题标题】:Django ORM: how count in annotation differ from count on query set?Django ORM:注释中的计数与查询集的计数有何不同?
【发布时间】:2019-09-23 13:05:31
【问题描述】:
qs = ...

qs = qs.annotate(v=Count('a', filter=Q(a__lt=5)))
a = qs.first().v
b = qs.filter(Q(a__lt=5)).count()

assert a == b  # error

这些方法会产生不同的结果有什么原因吗?

【问题讨论】:

  • 您在第一个qs 中聚合,而不是注释。
  • 什么是字段 'a',一个 FK?
  • 它只是模型中的一些非零字段
  • 那你的第一个注解意义不大,注解总是1。对每一行进行注解。
  • @WillemVanOnsem 我的理由是注释将使聚合计数整个 qs 并将结果添加到 qs 内的每个对象。而v 的值不应该和filter().count() 不同,但由于某种原因它是不同的。

标签: python django django-orm


【解决方案1】:

来自documentation关于Count(expression, **kwargs):

返回通过提供的表达式相关的对象数

所以Count 专门用于计算相关对象(通过 FK 或 M2M 关系),并且对行本身的任何其他列没有多大意义。在这种情况下,它通常会返回 1(可能取决于您的数据库返回什么值),因为总是有 1 个值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-14
    • 2015-11-15
    • 2016-04-04
    • 2020-07-20
    • 2022-01-19
    • 2019-04-18
    • 1970-01-01
    相关资源
    最近更新 更多