Django 在annotate()查询中进行筛选

Django 在annotate()查询中进行筛选,django,django-models,django-queryset,Django,Django Models,Django Queryset,我正在制作一个带有评论的django应用程序,并以stackoverflow或reddit风格对这些评论进行投票。在选择评论时,我想知道总票数,以及用户是否对该评论进行了投票。我可以对聚合计数使用注释,如下所示: video_comments = Comment.objects.filter(video_id=video_id).annotate(vote_sum=Sum('commentvote__value')) 我还可以注释注释投票的子集吗?比如: .annotate(user_vote

我正在制作一个带有评论的django应用程序,并以stackoverflow或reddit风格对这些评论进行投票。在选择评论时,我想知道总票数,以及用户是否对该评论进行了投票。我可以对聚合计数使用注释,如下所示:

video_comments = Comment.objects.filter(video_id=video_id).annotate(vote_sum=Sum('commentvote__value'))
我还可以注释注释投票的子集吗?比如:

.annotate(user_vote=Sum('commentvote__value').filter(commentvote__user == user))
作为参考,这是我的模型:

class Comment(models.Model):
    video_id = models.CharField(max_length=12, db_index=True)
    video_time = models.FloatField()

    comment = models.TextField(max_length=MAX_COMMENT_LENGTH)

    datetime = models.DateTimeField(auto_now_add = True)
    user = models.ForeignKey(User)

class CommentVote(models.Model):
    comment = models.ForeignKey(Comment, db_index=True)
    value = models.IntegerField() # Should be 1 or -1

    datetime = models.DateTimeField(auto_now_add = True)
    user = models.ForeignKey(User, db_index=True)

我认为这应该满足您的要求:

CommentVote.objects.values('comment').filter(comment__video_id=video_id,user=user).annotate(vote_sum=Sum('value')).values_list('comment','vote_sum',)
根据,可以在注释之前对给定字段进行过滤:

Comment.objects.filter(video_id=video_id).filter(commentvote__user=user))\
               .annotate(user_vote=Sum('commentvote__value'))
不幸的是,这将注释集缩小到只有给定用户投票的注释。但您也可以获得其余的评论:

Comment.objects.filter(video_id=video_id).exclude(commentvote__user=user))

然后手动合并两个列表。

我能知道我在这个答案中犯了什么错误吗?据我所知,它根本没有达到你宣传它应该达到的效果。但是如果你能证明它是有效的,那么我会很高兴地撤销投票。嘿,托马斯兹,我发现了一个可能的错误。过滤器应放在注释之前。还有错误吗?你的查询现在相当于:CommentVote.objects.filter(user=user,comment\u video\u id=video\u id)。values\u list('comment','value'),也就是说,它过滤给定用户对给定视频的投票,并为他们返回
comment\u id
value
(伪装成vote\u sum)。我认为(它也可以工作)
注释将基于
特定视频id和用户的
值('comment')
工作<代码>值\u列表
是该过程的下一步。请纠正我,如果我在任何地方都错了。顺便说一句,这也正是OP需要的,但是我不能在同一个相关模型上同时做两个注释,如果一个是“全局的”,第二个是过滤的..Argh,“现在”应该是“不”在上面的注释中您可能想添加
unique_=('comment',user')
评论投票
。另外,
ForeignKeys
上的
db\u索引在MySQL和PostgreSQL中是不必要的。谢谢Tomasz!我想念我们在一起的那个独特的时刻。