Django註釋非常適合平均值,最小/最大值等,它也可以計數。那麼它是否會生成相同的SQL,就像我在查詢集上使用舊的.count()一樣?或者它在某些情況下生成更高效的SQL?還是更糟糕的SQL?在django中,是否聚合(Count())比.count()更快或更好?
對不起,澄清,我打算比較count()操作與像聚合(計數('id'))其中id是表的PK。
因此,我相信Brian有正確的答案。簡而言之,count()只是aggregate()的一個特例。
Django註釋非常適合平均值,最小/最大值等,它也可以計數。那麼它是否會生成相同的SQL,就像我在查詢集上使用舊的.count()一樣?或者它在某些情況下生成更高效的SQL?還是更糟糕的SQL?在django中,是否聚合(Count())比.count()更快或更好?
對不起,澄清,我打算比較count()操作與像聚合(計數('id'))其中id是表的PK。
因此,我相信Brian有正確的答案。簡而言之,count()只是aggregate()的一個特例。
調用查詢集的.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()
,這將導致SELECT COUNT(*)...
(除非你也可以使用不同的字段()或者當你限制select子句中的字段時,在這種情況下它會更復雜)。
蘋果和橘子。 .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
假設Pizza和Topping有一個m2m的關係,在第二行中調用比薩的聚合將不會返回每個比薩的配料總數;它會將Pizza加入Topping並基本統計聯接的數量。要獲得每個披薩的配料數量,您需要使用annotate()而不是aggreate()。 –
對不起。我沒有描述聚合返回的內容。更新描述並添加'註釋'版本以突出顯示差異 –
如果一個打頂連接到多個比薩餅,它將會在'Pizza.objects.aggregate(topping_count = Count('toppings'))中加入到多個比薩餅中'因此這個計數將返回比配料的總數量多。爲了得到與匹薩相關的配料總數(沒有重複計數),你可能想要做一些類似於「Topping.objects.exclude(pizza_set = None).count()'。 –