首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django:过滤查询集,然后计数

Django:过滤查询集,然后计数
EN

Stack Overflow用户
提问于 2017-01-24 02:48:54
回答 2查看 2.5K关注 0票数 1

我正在尝试限制我在页面上执行的查询的数量。查询集返回过去24小时内创建的对象。然后,我希望过滤该查询集以根据字段计算对象数。

示例:

代码语言:javascript
复制
cars = self.get_queryset()
volvos_count = cars.filter(brand="Volvo").count()
mercs_count = cars.filter(brand="Merc").count()

随着品牌数量的增加(在本例中),查询的数量与必须查询的品牌数量呈线性增长。

如何对返回所有唯一品牌值和查询集中实例数量的汽车进行单个查询呢?

结果:

代码语言:javascript
复制
{'volvos': 4, 'mercs': 50, ...}

谢谢!

编辑:

到目前为止,这些评论已经很接近了,但并不完全中肯。使用values_list('brand', flat=True)将返回品牌。在那里,您可以使用

代码语言:javascript
复制
 from collections import Counter 

返回总数。如果有一种方法可以从一个查询中做到这一点,那就太好了,但这可能是不可能的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-01-24 03:17:31

要为每个不同的品牌生成计数,可以结合使用valuesannotate

代码语言:javascript
复制
totals = cars.values('brand').annotate(Count('brand'))

这将为您提供一个查询集,其中的每个元素都是一个包含brandbrand__count的字典。你可以直接把它转换成你想要的格式的字典:

代码语言:javascript
复制
{item['brand']: item['brand__count'] for item in totals}
票数 3
EN

Stack Overflow用户

发布于 2017-01-24 03:16:31

代码语言:javascript
复制
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')

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41813501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档