Django:过滤查询集然后计数
Django: Filtering a queryset then count
我正在尝试限制我在页面上执行的查询数量。查询集 returns 是最近 24 小时内创建的对象。然后我想过滤该查询集以根据字段计算对象。
示例:
cars = self.get_queryset()
volvos_count = cars.filter(brand="Volvo").count()
mercs_count = cars.filter(brand="Merc").count()
随着品牌数量的增加(在本例中),查询数量与必须查询的品牌数量呈线性增长。
如何对 return 品牌的所有唯一值和查询集中实例数的字典进行一次查询?
结果:
{'volvos': 4, 'mercs': 50, ...}
谢谢!
编辑:
到目前为止的评论,他们已经接近但不完全正确。使用 values_list('brand', flat=True)
将 return 品牌。从那里你可以使用
from collections import Counter
到return总数。如果有一种方法可以从单个查询中执行此操作,那就太好了,但也许这是不可能的。
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')
要为每个不同的品牌生成计数,请将 values
与 annotate
结合使用。
totals = cars.values('brand').annotate(Count('brand'))
这为您提供了一个查询集,其每个元素都是一个包含 brand
和 brand__count
的字典。您可以将其直接转换为您想要的格式的字典:
{item['brand']: item['brand__count'] for item in totals}
我正在尝试限制我在页面上执行的查询数量。查询集 returns 是最近 24 小时内创建的对象。然后我想过滤该查询集以根据字段计算对象。
示例:
cars = self.get_queryset()
volvos_count = cars.filter(brand="Volvo").count()
mercs_count = cars.filter(brand="Merc").count()
随着品牌数量的增加(在本例中),查询数量与必须查询的品牌数量呈线性增长。
如何对 return 品牌的所有唯一值和查询集中实例数的字典进行一次查询?
结果:
{'volvos': 4, 'mercs': 50, ...}
谢谢!
编辑:
到目前为止的评论,他们已经接近但不完全正确。使用 values_list('brand', flat=True)
将 return 品牌。从那里你可以使用
from collections import Counter
到return总数。如果有一种方法可以从单个查询中执行此操作,那就太好了,但也许这是不可能的。
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')
要为每个不同的品牌生成计数,请将 values
与 annotate
结合使用。
totals = cars.values('brand').annotate(Count('brand'))
这为您提供了一个查询集,其每个元素都是一个包含 brand
和 brand__count
的字典。您可以将其直接转换为您想要的格式的字典:
{item['brand']: item['brand__count'] for item in totals}