4

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

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

详细描述:假设我的 Django 应用程序中有两个模型,City 和 Country。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')

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

4

1 回答 1

7

使用聚合(Django 1.1 中的新功能)。你像这样使用它:

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

City要获得每个a 的最高人口Country,我认为您可以执行以下操作:

>>> from django.db.models import Max
>>> Country.objects.annotate(highest_city_population = Max('city__population'))
于 2010-01-18T16:58:04.843 回答