[英]Django annotation multiply fields
当我尝试注释我的 model 时,我遇到了两个字段相乘的问题
def get_queryset(self):
return self.queryset.annotate(
my_votes=Count("votes", filter=Q(votes=self.request.user), distinct=False)
vote_count=Count("votes", distinct=False)
comments_count=Count("comments", distinct=True)
)
我知道多个聚合存在问题
将多个聚合与 annotate() 组合会产生错误的结果,因为使用的是连接而不是子查询
例如,如果帖子上有 3 条评论,而我对该帖子投了 4 次投票,总共有 7 票,则计数将返回:
我的投票=12(4 我的投票 * 3 条评论)
vote_count=21(7 票 * 3 条评论)
评论数=3
如果我删除评论计数一切正常。
如果有 0 条评论,它也会正确计算
Post 和 Vote 之间存在 ManyToMany 关系
Comment 和 Post 之间是 ForignKey
还有另一种方法可以做到这一点吗?
谢谢您的帮助。
如果仅设置distinct=True
不起作用,那么您可以使用子查询,如Serafim 的答案所示。 鉴于您提到 Vote 和 Post 是多对多关系,您可以将例如my_votes
重写为直通表上的子查询,例如:
def get_queryset(self):
my_votes_sq = Subquery(
Vote.posts.through.objects
.filter(post_id=OuterRef("pk"), user_id=self.request.user.id)
.order_by()
.values("post_id")
.annotate(count=Count("pk"))
.values("count"), output_field=IntegerField()
)
...
return self.queryset.annotate(
my_votes=Coalesce(my_votes_sq, 0),
...
)
posts
、 post_id
、 user_id
的实际字段名称当然取决于您的模型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.