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

时间:2016-11-18 14:43:11

标签: django django-queryset django-orm

考虑一个简单的模型:

class Person(models.Model):
    name = models.CharField(max_length=256)
    age = models.IntegerField()

我想要一个表达式,它返回表中年龄最大的所有QuerySet个对象的Person。即假设有20 Person条记录,最大年龄为70,但有3条不同的记录具有该值。我希望我的queryset准确包含那3个Person个对象。

我想我能做到:

Person.objects.filter(age=Person.objects.aggregate(models.Max('age'))['age__max'])

但哇,这真是一团糟。它会两次击中数据库。呸。

更好的替代品?

1 个答案:

答案 0 :(得分:1)

我无法直接回答您的问题,但我觉得您不应该因为在一个查询中得到这个问题而吵醒,让您的代码清晰也很重要。那你为什么不这样做呢?

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语句中执行MAXfilter将执行简单的SQL查找,没有任何操作非常昂贵。