Python Django ORM:注释中的计数和查询集上的计数有何不同? qs=。。。 qs=qs.annotate(v=Count('a',filter=Q(a_ult=5))) a=qs.first().v b=qs.filter(Q(a_ult=5)).count() 断言a==b#错误

Python Django ORM:注释中的计数和查询集上的计数有何不同? qs=。。。 qs=qs.annotate(v=Count('a',filter=Q(a_ult=5))) a=qs.first().v b=qs.filter(Q(a_ult=5)).count() 断言a==b#错误,python,django,django-orm,Python,Django,Django Orm,这些方法产生不同结果的原因是什么?来自about计数(表达式,**kwargs): 返回通过提供的表达式相关的对象数 因此,Count专门用于计算相关对象(通过FK或M2M关系),在行本身的任何其他列上都没有多大意义。在这种情况下,它通常会返回1(可能取决于您的db返回了什么值),因为总是有1个值。看起来您在第一个qs中聚合,而不是注释。字段“a”是什么,FK?它只是模型中的某个非零字段,那么您的第一个注释没有多大意义,注释总是1。注释是为每一行执行的。@WillemVanOnsem我的推理是注

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

来自about
计数(表达式,**kwargs)

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


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

看起来您在第一个
qs
中聚合,而不是注释。字段“a”是什么,FK?它只是模型中的某个非零字段,那么您的第一个注释没有多大意义,注释总是1。注释是为每一行执行的。@WillemVanOnsem我的推理是注释将使聚合计数覆盖整个qs,并将结果添加到qs中的每个对象。而
v
的值不应与
filter().count()
不同,但出于某种原因,它是不同的。