django - Django - 如何在带注释的查询集上使用更新而不是使用 for 循环?
问题描述
我必须从注释构建一个字段,该字段是一个分数,它等于基于不同查询集表达式的其他两个注释的划分。
annotated_queryset = Influencer.objects.annotate(
score_sum=Sum('submission__answer__decisions__score'),
submission_count=Count('submission',
filter=Q(
submission__status__in=Submission.ANSWERED_STATUS
)
)
).annotate(rate=F('score_sum') / F('submission_count'))
这个片段显示了我如何获得我的注释。
现在我很想能够做到以下几点:
annotated_queryset.update(acceptation_rate=F('rate'))
但我得到一个FieldError: Aggregate functions are not allowed in this query
我唯一的解决方案是使用丑陋且昂贵的 for 循环:
for each in annotated_queryset:
each.acceptation_rate = each.rate
each.save()
我的问题是:
- 为什么我不能使用注释 + 更新表单?
- 有没有比 for 循环更好的方法来做到这一点?那会是什么?
编辑,使用子查询:
annotated_queryset = Influencer.objects.annotate(
score_sum=Sum('submission__answer__score'),
submission_count=Count('submission',
filter=Q(
submission__status__in=Submission.ANSWERED_STATUS
)
)
).annotate(
rate=ExpressionWrapper(
F('score_sum') / F('submission_count'),
output_field=FloatField()
)
)[:1]
Influencer.objects.update(acceptation_rate=Subquery(annotated_queryset))
解决方案
推荐阅读
- php - 图像位置未发送到数据库和本地目录
- html - 组织 HTML 背景图像
- sql - 如何在 SQL Server 中添加自动增量值
- python - Python struct 'pack and unpack' 无法正常工作
- windows - 如何通过设置为绕过的相对路径和执行策略启动 powershell 脚本?
- javascript - 正则表达式只接受 7 种特殊字符
- javascript - 打印时转到下一行
- c# - C# - SQLite 选择不同的行然后作为字符串列表返回
- html - HTML/CSS 输入字段缩小
- hyperledger-fabric - 错误:错误支持调用:rpc 错误:代码 = 不可用 desc = 传输正在关闭 - 提案响应: