2017-01-23 159 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')