繁体   English   中英

Django 注释乘法字段

[英]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() 组合会产生错误的结果,因为使用的是连接而不是子查询

django 文档

例如,如果帖子上有 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),
        ...
    )

postspost_iduser_id的实际字段名称当然取决于您的模型。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM