Просчет количества полей в запросе Django "многие ко многим

Я создаю Django Blog Website и застрял на одном моменте - поиске количества лайков на конкретной записи. Я создал веб-страницу, на которой отображаются все посты. Теперь я столкнулся с проблемой: количество лайков вычисляется неправильно.

Post Model ->

class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    title = models.CharField(max_length=255)   
    description = models.CharField(max_length=1000,null=True)
    Tags = models.CharField(max_length = 255,null=True,blank=True)
    Created_date = models.DateTimeField(auto_now_add=True)
    Updated_date = models.DateTimeField(auto_now=True)
    category = models.ForeignKey(Category, on_delete=models.PROTECT)
    Likes = models.ManyToManyField(to=User, related_name='Post_likes')
    favourites = models.ManyToManyField(to=User,blank=True,related_name="favourite")

    def __str__(self):
        return self.title

Запрос в файле Views.py для получения всех постов ->

posts =  Post.objects.select_related().prefetch_related('images_set').annotate(Count('comments_post')).annotate(Count('Likes')).all()

Теперь, когда я вижу post.Likes__count в шаблоне, он показывает неправильное количество 6 для одного конкретного сообщения, но когда я использую post.likes.count(), он показывает количество 3.

в других сообщениях они оба показывают один и тот же результат. Я не могу выяснить, почему это происходит. Вот результат для этого конкретного поста ->

{'post_id': 22, 'user_id': 1, 'title': 'wkjdfh', 'description': 'kjwdfn', 'Tags': '.,smdf,m', 'category': <Category: Shoes>, 'userName': 'admin', 'images': <QuerySet [<Images: Images object (10)>, <Images: Images object (11)>, <Images: Images object (12)>, <Images: Images object (13)>]>, 'comments_count': 6, 'likesCount': 6, 'actualLikeCount': 3}

Это очень странно, что происходит, и я знаю, что для этого есть причина, но я не могу найти причину.

Вам не нужно использовать ".annotate(Count('Likes'))". Чтобы получить количество лайков в шаблоне, вы можете сделать следующее:

{{post.Likes.count}}

Согласно документации Django:

Объединение нескольких агрегаций с помощью функции annotate() даст неверные результаты, поскольку вместо подзапросов используются объединения

ссылка: https://docs.djangoproject.com/en/4.0/topics/db/aggregation/#combining-multiple-aggregations

Попробуйте использовать .annotate(Count(...), distinct=True).

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