web-dev-qa-db-ja.com

Django集計-式には混合型が含まれています。output_fieldを設定する必要があります

私は集約クエリを達成しようとしています、それは私のコードです:

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'を出力フィールドとして呼び出しているので、何が問題なのですか?

ありがとう!

18
Lara

沿って output_field Djangoは、Sumの結果のフィールドタイプを提供することを意味します。

from Django.db.models import FloatField, F
total_group=Sum(F('total_sold')*F('final_price'), output_field=FloatField())

トリックを行う必要があります。

34
Todor

クエリを機能させるために、別のものを使用する必要がありました。ちょうど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/