如何在Django中聚合一个查询集?

时间:2010-01-18 16:51:38

标签: django django-queryset

简短描述:给定一个查询集myQueryset,如何在不实际检索所有行并在python中执行max("myfield")的情况下选择max

我能想到的最好的是max([r["myfield"] for r in myQueryset.values("myfield")]),如果有数百万行,那就不是很好。

详细说明:假设我的Django应用程序中有两个模型,City和Country。城市有一个国家的外键领域:

class Country(models.Model):
    name = models.CharField(max_length = 256)

class City(models.Model):
    name = models.CharField(max_length = 256)
    population = models.IntegerField()
    country = models.ForeignKey(Country, related_name = 'cities')

这意味着国家/地区实例可用.cities。假设我现在想为国家编写一个名为highest_city_population的方法,它返回最大城市的人口。来自LINQ背景,我的本能是尝试myCountry.cities.max('population')或类似的东西,但这是不可能的。

1 个答案:

答案 0 :(得分:7)

使用Aggregation(Django 1.1中的新增功能)。你这样使用它:

>>> from django.db.models import Max
>>> City.objects.all().aggregate(Max('population'))
{'population__max': 28025000}

要为每个City获得Country的最高人口,我认为您可以这样做:

>>> from django.db.models import Max
>>> Country.objects.annotate(highest_city_population = Max('city__population'))