我正在尝试计算likes
模型中的所有Posts
class Posts(models.Model):
user_profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
likes = models.ManyToManyField(User, blank=True, related_name='likes')
我正在尝试的是
all_posts = Posts.objects.all()
j = all_posts.filter(user_profile=2).values('likes').count()
但是,如果不喜欢任何一个帖子(即用户未选择ManyToMany字段),则此方法的计数不正确,因为它在QuerySet中也计算为{'likes': None}
。例如,当不喜欢任何帖子时,queryset为<QuerySet [{'likes': None}, {'likes': None}, {'likes': None}, {'likes': None}, {'likes': None}]>
,因此我得到的计数为5,这是不正确的。
因此,有什么方法可以只对ManyToMany
字段中的选定值进行计数,或者在对queryset的值进行计数时排除{'likes': None}
。
注意:每个帖子至少有一个likes
时,我就会得到正确的计数。
答案 0 :(得分:2)
可以使用注释和聚集实现这一目标。
from django.db.models import Count, Sum
likes = (
Posts.objects
.filter(user_profile=2) # filtering the post of specific user
.annotate(likes_count=Count('likes')) # counting likes on each post
.aggregate(total_likes=Sum('likes_count')) # Summing likes on each post to give total likes
)