简短描述:给定一个查询集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')
或类似的东西,但这是不可能的。
答案 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'))