Djangoで集計クエリ(1.1以降でannotateを使用)

Djangoのモデルで集計クエリというと、1.0以降でcount()が使えますが、1.1になってさらに多機能になっていました。

from django.db.models import Sum

_result = Detail.objects.all().values(‘category’).annotate(price=Sum(‘price’))
for item in _result:

    print item

Detailというモデルがあって、それをcategoryというフィールドでグループ化し、priceというフィールドのsum(合計)を求めています。

values(~)は必須ではありません。グループ化しないと全体のsumですね。

annotate(得られる結果の名前=Sum(集計対象フィールド))

です。サンプルの「price」をsum_priceにしても結果は得られます。

また、annotateで利用できるのはsumだけでなく、Avg、Max、Min、Countも使用できます。サンプルコードだとSumしかインポートしていませんが、「*」でまとめてインポートするか、「Avg, Max, Min, Sum, Count」をそれぞれインポートしてあげれば使用できます。

ちなみに、サンプルコードで得られるitemは、Detailモデルのインスタンスではありません。辞書です。最初ここに気づかず、「?」となっていました。w