2017-01-23 140 views
1

我試圖限制在頁面上執行的查詢數。查詢集返回在過去24小時內創建的對象。然後我想過濾該查詢集來根據字段計算對象。Django:篩選查詢集然後計數

實施例:

cars = self.get_queryset() 
volvos_count = cars.filter(brand="Volvo").count() 
mercs_count = cars.filter(brand="Merc").count() 

隨着越來越多的品牌(在該示例中),查詢的數量與必須被查詢品牌的數量線性增長。

如何爲汽車進行單一查詢,以便返回品牌的所有唯一值的字典和查詢集中實例的數量?

結果:

{'volvos': 4, 'mercs': 50, ...} 

謝謝!

編輯:

的意見,到目前爲止,他們已經接近,但不太上的標記。使用values_list('brand',flat = True)將返回品牌。從那裏,你可以使用

from collections import Counter 

要返回的總數。如果有一種方法可以從單個查詢中完成,但這可能是不可能的。

回答

2

要爲每個不同品牌的計數,你在結合使用valuesannotate

totals = cars.values('brand').annotate(Count('brand')) 

這給你一個查詢集,它的每個元素與brandbrand__count字典。你可以轉換成直接與格式的字典你想:

{item['brand']: item['brand__count'] for item in totals} 
+0

是接近的,好像做到這一點的一種方式就是queryset.values_list(「品牌」,扁= TRUE),然後用計數器結果。這將返回我正在查找的值和計數。 – Emile

+0

使用計數器確實可以工作 - 但是一旦您開始獲得大量結果,會非常慢。這種工作更適合於數據庫。 – Shadow

0
SELECT brand, COUNT(*) as total 
FROM cars 
GROUP BY brand 
ORDER BY total DESC 

等效:

cars.objects.all().values('brand').annotate(total=Count('brand')).order_by('total')