Как получить объект по максимальному значению в 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 записи.

Вернуться на верх