2016-11-18 80 views
2

最大考虑一个简单的模型:在Django的ORM,得到记录,其字段值是一个QuerySet

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

我想一个表达式返回所有Person对象,其年龄的QuerySet是最大的桌子。即假设有20 Person记录,最大年龄为70,但有3个不同记录具有该值。我希望我的查询集恰好包含那些3 Person对象。

我想我可以做的:

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

但哇,这似乎是一个真正的混乱。它击中数据库两次。呸。

更好的选择?

回答

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查询,没有任何操作都非常昂贵。