如何使用Django ORM改进此查询?

时间:2017-01-09 13:28:23

标签: python django

我有一个Person模型,其中namecity为属性。我需要一种方法来检索城市的人数。我需要像这个词典的输出:{"NY": 23, "CA": 30, ...}

我做的是:

response = {}
for city in ["NY", "CA", ...]:
    response[city] = Person.objects.filter(city=city).count()

在这里,我必须提供一个包含城市的预定义列表并迭代它们。有没有办法直接用Django ORM做这个并避免循环?

2 个答案:

答案 0 :(得分:1)

这样做

A instanceOfA = ...;
methodName = "something";
Method somethingMethod = instanceOfA.getClass().getMethod(methodName);
somethingMethod.invoke(instanceOfA);

更新

正如OP正确指出的那样,您可以省略response = dict(Person.objects.values('city').\ annotate(count=Count('city')).\ values_list('city', 'count'))

.values('city')

答案 1 :(得分:1)

所以要解决这个问题,我基本上会回到准系统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'))