Django ORM:注释中的计数与查询集的计数有何不同?
Django ORM: how count in annotation differ from count on query set?
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
为什么这些方法会产生不同的结果?
来自documentation 关于Count(expression, **kwargs)
:
Returns the number of objects that are related through the provided expression
所以 Count
专门用于计算相关对象(通过 FK 或 M2M 关系),并且对行本身的任何其他列没有多大意义。在这种情况下,它通常是 return 1(可能取决于您的数据库 returned 的值),因为总是有 1 个值。
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
为什么这些方法会产生不同的结果?
来自documentation 关于Count(expression, **kwargs)
:
Returns the number of objects that are related through the provided expression
所以 Count
专门用于计算相关对象(通过 FK 或 M2M 关系),并且对行本身的任何其他列没有多大意义。在这种情况下,它通常是 return 1(可能取决于您的数据库 returned 的值),因为总是有 1 个值。