В 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')