Django注释非常适合平均值,最小值/最大值等。它也可以计数。那么生成相同的SQL就好像我在查询集上使用旧的.count()一样?或者它在某些情况下会生成更高效的SQL吗?或者更糟糕的SQL?
很抱歉,澄清一下,我的意思是将count()操作与聚合(Count('id'))进行比较,其中id是表的PK。
因此,我相信Brian有正确的答案。简而言之,count()只是aggregate()的特例。
答案 0 :(得分:10)
调用查询集的.count()
方法最终会调用Count()
。
具体做法是:
django.db.models.QuerySet.count()
来电
django.db.models.sql.Query.get_count()
,来电
django.db.models.sql.Query.add_count_column()
,补充说
django.db.models.sql.aggregates.Count
查询。
两者之间的主要区别在于,当您直接使用Count
时,指定要计数的字段,而当您在查询集上调用.count()
时,这将导致{{1 (除非你也使用distinct()或限制select子句中的字段,在这种情况下它更复杂)。
答案 1 :(得分:3)
苹果和橘子。 .count()
对当前查询集执行SQL计数。但是,Count
聚合会对您在查询集上指定的关系运行计数。
Pizza.objects.count() # Total amount of pizzas
Pizza.objects.aggregate(topping_count=Count('toppings')) # Total amount of toppings associated to a pizza
Pizza.objects.annotate(topping_count=Count('toppings')) # Total amount of toppings on each pizza