В Django объединение и упорядочивание подсчетов по двум полям модели

У меня есть две упрощенные модели, представляющие людей и письма, которые были отправлены и получены этими людьми:

class Person(models.Model):
    name = models.CharField(max_length=200, blank=False)

class Letter(models.Model):
    sender = models.ForeignKey(Person, blank=False, related_name="letters_sent")
    recipient = models.ForeignKey(Person, blank=False, related_name="letters_received")

Я хочу вывести список Person, упорядоченный по количеству отправленных и полученных писем.

Я начал делать это очень трудоемко, но решил, что должен быть более простой способ.

Например, это позволяет получить идентификаторы Person и подсчитать, сколько раз они отправляли Letter:

senders = (
    Letter.objects.order_by()
    .values(person_id=F("sender"))
    .annotate(count=Count("pk"))
    .distinct()
)

Я могу сделать то же самое для получателей.
Затем объедините их в один список/диктант, добавив count вместе.
Отсортируйте его.
Затем раздуйте эти данные до реальных объектов Person и передайте их в шаблон.

Но я чувствую, что должен быть менее трудоемкий способ, начиная, я думаю, с одного запроса, чтобы получить комбинированный счетчик отправленных и полученных данных.

Вы должны быть в состоянии подсчитать все буквы и аннотировать это в наборе запросов о человеке. Это будет менее трудоемко с точки зрения написания кода Django (хотя я не могу сказать, будет ли это менее трудоемко для базы данных или нет).

В любом случае, это должно быть в правильном районе для того, что я описываю:

queryset = Person.objects.annotate(
    letter_count=(
        Count('letters_sent') + Count('letters_received'))
    )
).order_by('-letter_count')
Вернуться на верх