2016-11-18 1 views
2

Рассмотрим простую модель:В Django ORM, получить записи, поле которых значение является максимальным в QuerySet

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

Я хотел бы одно выражение, которое возвращает QuerySet из всех Person объектов, возраст которых максимальна стол. То есть говорят, что есть 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 бы MAX в SQL заявление, filter бы сделать простой SQL поиск, ни одна из операций не очень дорого.