考虑一个简单的模型:
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'])
但哇,这真是一团糟。它会两次击中数据库。呸。
更好的替代品?
答案 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语句中执行MAX
,filter
将执行简单的SQL查找,没有任何操作非常昂贵。