簡體   English   中英

Django:過濾查詢集然后計數

[英]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 

返回總計。 如果有一種方法可以通過單個查詢執行此操作,那將是很好,但也許是不可能的。

要為每個不同的品牌生成計數,請結合使用valuesannotate

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

這為您提供了一個查詢集,每個查詢集的元素都是帶有brandbrand__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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM