在django中,聚合(Count())是否比.count()更快或更好?

时间:2011-10-31 17:51:44

标签: django

Django注释非常适合平均值,最小值/最大值等。它也可以计数。那么生成相同的SQL就好像我在查询集上使用旧的.count()一样?或者它在某些情况下会生成更高效的SQL吗?或者更糟糕的SQL?

很抱歉,澄清一下,我的意思是将count()操作与聚合(Count('id'))进行比较,其中id是表的PK。

因此,我相信Brian有正确的答案。简而言之,count()只是aggregate()的特例。

2 个答案:

答案 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