Подсчет и суммирование объектов из разных моделей - Django
Я работаю над своим проектом Django и пытаюсь упорядочить посты по сумме двух связанных моделей.
Так что этот запрос должен взять подсчет посещаемости из модели Post и подсчет посещаемости из модели Attending и получить общую сумму.
Вот эти модели:
class Post(models.Model):
title = models.CharField(max_length=100)
attendance = models.ManyToManyField(User, related_name='user_event_attendance')
class Attending(models.Model):
attendant = models.ForeignKey(User, related_name='events_attending', on_delete=models.CASCADE, null=True)
post = models.ForeignKey('Post', on_delete=models.CASCADE, null=True)
Теперь у меня есть счетчик "посещаемости" модели поста и упорядоченный по счету:
views.py
new_query = Post.objects.filter(
Q(status='NOT STARTED', post_options='PUBLIC') | Q(status='IN PROGRESS',post_options='PUBLIC')).distinct().annotate(total=Count('attendance')).order_by(-total')
Вы получаете дубликаты в своих подсчетах из-за этого документированного поведения:
Объединение нескольких агрегаций с помощью
annotate()даст неверные результаты, поскольку вместо подзапросов используются объединения.... Для большинства агрегатов нет способа избежать этой проблемы, однако агрегат
Countимеет параметрdistinct, который может помочь.
Вы можете решить эту проблему, добавив параметр distinct к обеим аннотациям count:
new_query = Post.objects.filter(
Q(status='NOT STARTED', post_options='PUBLIC') | Q(status='IN PROGRESS',post_options='PUBLIC')
).distinct().annotate(
total_attendance=Count('attendance', distinct=True), # Add distinct
total_attendant=Count("attending__attendant", distinct=True) # Add distinct
).annotate(
total=F("total_attendant") + F("total_attendance")
).order_by('-total')
Кроме того, Count("attending__attendant", distinct=True) можно упростить до Count("attending", distinct=True), поскольку для каждого экземпляра Attending может быть только один обслуживающий персонал.