如何计算ManyToMany字段的值?

时间:2019-01-30 18:03:43

标签: django django-models django-queryset

我正在尝试计算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时,我就会得到正确的计数。

1 个答案:

答案 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
    )