私は集約クエリを達成しようとしています、それは私のコードです:
TicketGroup.objects.filter(event=event).aggregate(
total_group=Sum(F('total_sold')*F('final_price')))
TicketGroupオブジェクトに「total_sold」と「final_price」があり、すべての値を合計して乗算し、すべてのTicketGroupの合計販売数を取得しています。
私が得るすべてはこのエラーです:
式に混合タイプが含まれています。 output_fieldを設定する必要があります
'total_group'を出力フィールドとして呼び出しているので、何が問題なのですか?
ありがとう!
沿って output_field
Djangoは、Sum
の結果のフィールドタイプを提供することを意味します。
from Django.db.models import FloatField, F
total_group=Sum(F('total_sold')*F('final_price'), output_field=FloatField())
トリックを行う必要があります。
クエリを機能させるために、別のものを使用する必要がありました。ちょうどoutput_fieldはそれを解決しません。 2つのエイリアス間の単純な分割が必要でした。これらは2つの注釈の出力です。
from Django.db.models import FloatField, ExpressionWrapper, F
distinct_people_with_more_than_zero_bill = Task.objects.filter(
billable_efforts__gt=0).values('report__title').annotate(
Count('assignee', distinct=True)).annotate(
Sum('billable_efforts'))
annotate(yy=ExpressionWrapper(F('billable_efforts__sum') / F('assignee__count'), output_field=FloatField()))
ここでのキーはExpressionWrapperです。これがないと、エラーが発生します:received non-expression(s)
ヒントはDjangoドキュメンテーション自体のために来ました:
組み合わせるフィールドのタイプが異なる場合は、Django返されるフィールドの種類を指定する必要があります。F()はoutput_fieldを直接サポートしていないため、ExpressionWrapperで式をラップする必要があります
リンク: https://docs.djangoproject.com/en/2.2/ref/models/expressions/