首页 > 解决方案 > Django 查询多对多

问题描述

我想做一个查询来选择在他们的帖子中有更多喜欢的前 5 个用户。

我的模型是:

class Post(ModelBase):
     title = models.CharField('Title', max_length=255)
     description = models.TextField()
     finished = models.BooleanField(default=False)
     author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='post_author')
     likes = models.ManyToManyField(User, through='PostLike',)
     tags = models.ManyToManyField(Tag, related_name='tags')

     def total_likes(self):
         return self.likes.count()

class PostLike(ModelBase):
     post = models.ForeignKey(Post, on_delete=models.CASCADE)
     user = models.ForeignKey(User, on_delete=models.CASCADE)

我有这个,但它不适合我。不要告诉用户帖子的点赞数,而是计算每个用户给出的点赞数。

users = User.objects.annotate(likes_count=Count('postlike', Q(post__is_active=True)))\
        .order_by('likes_count').reverse()[0:5]

标签: pythondjangodjango-rest-framework

解决方案


而不是注释您需要注释(通过您设置的相关名称遍历关系)的Count计数:postlikepost_author__likes

users = User.objects.annotate(
    likes_count=Count(
        'post_author__likes',
        filter=Q(post_author__is_active=True)
    )
).order_by('-likes_count')[0:5]

推荐阅读