2016-01-20 11 views
10

djangoのORM annotate()および/またはaggregate()を使用する:1つのカテゴリフィールドに基づいて合計し、日付ごとにカテゴリ値を平均したい。私は2つのannotate()ステートメントを使用してそれをしようとしましたが、FieldErrorを取得しました。私はこれをやっているdjango aggregation:sum then average

(カテゴリの各値に対してそれほど合計)のようなものでValuesQuerySetオブジェクトを出力
queryset1 = self.data.values('date', 'category').annotate(sum_for_field=Sum('category')) 

[{'category': 'apples', 'date': '2015-10-12', sum_for_field=2000}, 
{'category': 'carrots', 'date': '2015-10-12', sum_for_field=5000}, 
{'category': 'apples', 'date': '2015-10-13', sum_for_field=3000}, 
{'category': 'carrots', 'date': '2015-10-13', sum_for_field=6000}, ... 
] 

私はその後、sum_for_fieldを平均化したいですフィールドを以下のように出力します。

[ {'date': '2015-10-12', avg_final: 3500}, 
{'date': '2015-10-13', avg_final: 4500}, ... 
] 

私はこれを試しました:

queryset2 = queryset1.values('date', 'sum_for_field') 
result = queryset2.annotate(avg_final=Avg('sum_for_field')) 

しかし、私はこのFieldErrorだ:私は深いダイビングを行っていないが、私はあなたが注釈なしvalues()を使用する場合、sum_for_field値がものを共有してマージされていることを疑う

FieldError: FieldError: Cannot compute Avg('sum_for_field'): 'sum_for_field' is an aggregate 
+1

'.annotate()'を '.aggregate()'に変更する必要があります。詳細については、docsを参照してください。https://docs.djangoproject.com/en/1.9/topics/db/aggregation/ – jape

+0

@japeこれを回答に追加しないでください。例](https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#集約 - 注釈)。 – tutuDajuju

+1

その例は私が望むものではありません。 – user1387717

答えて

0

を同じdatevalues()句を使用した直後にアノテーションを評価する必要があると思います。たぶん、以下のようなものは、あなたの問題を解決します:グループによる多くの集計注釈からグループによる

result = queryset1.values('date').annotate(avg_final=Avg('sum_for_field'))

1

集計注釈は、一般的に複雑な問題ですが、SumからAvgは特別はるかに簡単ケースです。

Avg('sum_for_field')は、Aggregate() expressionsで評価できるSum('sum_for_field')/Count('category', distinct=True)と評価できます。 Sum('sum_for_field')Sum('amount')になります。

ソリューション:(期待名:モデルは、amountフィールドdatecategoryを持ってDataである。)

qs = Data.objects.values('date').annotate(
    avg_final=Sum('amount')/Count('category', distinct=True) 
) 

は(私は現在ジャンゴによるいかなる解決せずに非常によく似た質問があろうと確信しています1.11、Subqueryクラスでも、奇妙なextra()メソッドを使用せず、未処理のSQLを使用しない)