Django:过滤一个查询集然后计数

时间:2017-01-23 18:48:54

标签: python django django-queryset django-orm

我试图限制我在网页上执行的查询次数。查询集返回过去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 

返回总数。如果有一种方法可以从单个查询中执行此操作,那将会很棒,但也许它是不可能的。

2 个答案:

答案 0 :(得分:2)

要为每个不同品牌生成计数,请将valuesannotate结合使用。

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

这会为您提供一个查询集,其每个元素都是一个包含brandbrand__count的字典。您可以将其直接转换为具有所需格式的dict:

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

答案 1 :(得分: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')