首页 > 解决方案 > 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()

我的问题是:

编辑,使用子查询:

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))

标签: djangodjango-models

解决方案


推荐阅读