在Django ORM中,获取字段值在查询集中最大的记录

在Django ORM中,获取字段值在查询集中最大的记录,django,django-queryset,django-orm,Django,Django Queryset,Django Orm,考虑一个简单的模型: class Person(models.Model): name = models.CharField(max_length=256) age = models.IntegerField() 我想要一个表达式,它返回表中年龄最大的所有Person对象的QuerySet。例如,假设有20个人记录,最大年龄为70,但有3个不同的记录具有该值。我希望我的查询集正好包含这3个Person对象 我想我可以做到: Person.objects.filter(age=P

考虑一个简单的模型:

class Person(models.Model):
    name = models.CharField(max_length=256)
    age = models.IntegerField()
我想要一个表达式,它返回表中年龄最大的所有
Person
对象的
QuerySet
。例如,假设有20个
记录,最大年龄为
70
,但有3个不同的记录具有该值。我希望我的查询集正好包含这3个
Person
对象

我想我可以做到:

Person.objects.filter(age=Person.objects.aggregate(models.Max('age'))['age__max'])
但是哇,那看起来真是一团糟。它会两次访问数据库。恶心


更好的选择?

我不能直接回答您的问题,但我觉得您不应该因为在一次查询中就得到了这一点而感到沮丧,让代码清晰也很重要。那你为什么不:

from django.db.models import Max
# assumes that you have at least one record
max_age = Person.objects.aggregate(Max('age'))['age__max']
oldest_folks = Person.objects.filter(age=max_age)
Max
将执行sql语句中的
Max
filter
将执行简单的sql查找,所有操作都不会非常昂贵