Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?

Posted

技术标签:

【中文标题】Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?【英文标题】:Django Annotate - Can I used the fields created in annotate for another field created in annotate? 【发布时间】:2021-01-30 11:08:17 【问题描述】:

我正在计算每个部门的分数总和以及注释中每个部门的用户数,如下所示:

queryset = Depts.objects.annotate(total_pts=Sum('userprofiles__user__activity_user__activity_category__pts'), total_users=Count('userprofiles', distinct=True)).order_by('-total_pts')

我还想作为返回数据的一部分发回 avg_score = total_pts / total_users。有没有办法将它添加到注释中,或者将它们链接在一起,或者以其他方式将它添加到返回查询集中?

编辑:

我尝试添加如下内容:

queryset = Depts.objects.annotate(total_pts=Sum('userprofiles__user__activity_user__activity_category__pts'), total_users=Count('userprofiles', distinct=True), avg_score=total_pts/total_users).order_by('-total_pts')

错误提示未定义 total_pts。

谢谢。

【问题讨论】:

当前设置有什么问题?有错误吗?什么错误?也添加一个最小可验证示例 【参考方案1】:

用 F() 弄明白了,之前一直不太明白怎么用:

queryset = Depts.objects.annotate(total_pts=Sum('userprofiles__user__activity_user__activity_category__pts'), total_users=Count('userprofiles', distinct=True), avg_score=F('total_pts') / F('total_users')).order_by('-avg_score')

【讨论】:

以上是关于Django Annotate - 我可以将在 annotate 中创建的字段用于在 annotate 中创建的另一个字段吗?的主要内容,如果未能解决你的问题,请参考以下文章

Django:替代使用 annotate(Count()) 来提高速度

Django annotate() 多次导致错误答案

使用 annotate() 包含一个 django 模型对象属性

Django:仅使用 annotate() 和 values() 计算非空 CharField

Django基础aggregate和annotate方法使用详解与示例

Django 聚合计数