代码之家  ›  专栏  ›  技术社区  ›  Taek

Django-如何在带注释的queryset上使用update而不是for循环?

  •  0
  • Taek  · 技术社区  · 6 年前

    我必须从一个注释构建一个字段,该字段是一个分数,等于基于不同queryset表达式的其他两个注释的除法。

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

    • 为什么我不能使用annotate+update表单?
    • 有比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))
    
    0 回复  |  直到 6 年前