Просчет количества полей в запросе 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).