[英]How can I improve this query with Django ORM?
我有一个以name
和city
为属性的Person
模型。 我需要一种按城市检索人数的方法。 我需要类似以下字典的输出: {"NY": 23, "CA": 30, ...}
我所做的是:
response = {}
for city in ["NY", "CA", ...]:
response[city] = Person.objects.filter(city=city).count()
在这里,我必须提供一个包含城市的预定义列表,然后对它们进行迭代。 是否有任何直接使用Django ORM并避免循环的方法?
这会做
response = dict(Person.objects.values('city').\
annotate(count=Count('city')).\
values_list('city', 'count'))
正如OP正确指出的那样,您可以省略.values('city')
:
response = dict(Person.objects.annotate(count=Count('city')).\
values_list('city', 'count'))
因此,为了解决此问题,我基本上回到了准系统SQL。 您想要这样的东西:
SELECT city, count(*) FROM person
WHERE city in (...)
GROUP BY 1
然后尝试搜索,如何在django ORM中创建聚合参数:
from django.db.models import Count
Person.objects.filter(city__in=cities).annotate(count=Count('city'))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.