[英]Django: Filtering a queryset then count
我試圖限制我在頁面上執行的查詢數量。 查詢集返回最近24小時內創建的對象。 然后,我想過濾該查詢集以基於字段對對象進行計數。
例:
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
返回總計。 如果有一種方法可以通過單個查詢執行此操作,那將是很好,但也許是不可能的。
要為每個不同的品牌生成計數,請結合使用values
和annotate
。
totals = cars.values('brand').annotate(Count('brand'))
這為您提供了一個查詢集,每個查詢集的元素都是帶有brand
和brand__count
的字典。 您可以將其直接轉換為所需格式的字典:
{item['brand']: item['brand__count'] for item in totals}
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')
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.