Как получить объект по максимальному значению в Django ORM
Я ищу лучший способ сделать это: мне нужно получить объект с наибольшим значением в модели.
Значение не хранится в поле, вместо этого оно представляет собой ряд объектов из связанной (вторичной) модели (отношения ManyToOne, ForeignKey)
Я пробовал следующее:
from django.db.models import *
annotatedPM = PrimaryModel.objects.annotate(Count('secondarymodel'))
max_value = annotatedPM.aggregate(Max('secondarymodel__count'))['secondarymodel__count__max']
annotatedPM.get(secondarymodel__count=max_value)
>>> <PrimaryModel: object>
Этот вариант работает хорошо, но мне интересно, есть ли лучший способ сделать это?
Просто упорядочьте элементы по аннотациям:
from django.db.models import Count
annotatedPM = PrimaryModel.objects.annotate(Count('secondarymodel')).order_by(
'-secondarymodel__count'
).first()
или еще короче с помощью .latest(…)
[Django-doc]:
from django.db.models import Count
annotatedPM = PrimaryModel.objects.annotate(Count('secondarymodel')).latest(
'secondarymodel__count'
)
при этом возникнет ошибка, если во всей таблице нет ни одной PrimaryModel
записи.