首页 > 解决方案 > 如何编写查询以在 Django 中获取查询集

问题描述

我想获得特定作者撰写的所有帖子的点赞数。我尝试过类似下面的方法,

Post.objects.filter(author=1).liked.count()

但是,它返回

Traceback (most recent call last):
  File "<console>", line 1, in <module>
AttributeError: 'QuerySet' object has no attribute 'liked'

我可以通过以下方式获取特定帖子的点赞数,

Post.objects.filter(author=1).first().liked.count()

如何在我的 views.py 文件中处理这个逻辑?

模型.py:

class Post(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField(validators=[MinLengthValidator(200)])
    liked = models.ManyToManyField(User, default=None, blank=True, related_name = 'liked')
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name = 'author')

    def __str__(self):
        return self.title

    @property
    def num_likes(self):
        return self.liked.all().count()

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'pk': self.pk})

LIKE_CHOICES = (

('Like', 'Like'),
('Unlike', 'Unlike'),

)

class Like(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    value = models.CharField(choices= LIKE_CHOICES,default='Like', max_length=10)


    def __str__(self):
        return str(self.post)

标签: pythondjangodjango-modelsdjango-views

解决方案


你可以这样尝试aggregation

from django.db.models import Count, Sum

Post.objects.filter(author=1).annotate(like_count=Count('liked')).aggregate(total_likes=Sum('like_count'))['total_likes']

仅供参考,如果你有一个多对多关系模型,那么你可以使用这个:through Like

Like.objects.filter(post__author_id=1).count()

或者

Like.objects.filter(post__author=request.user).count()

推荐阅读