まず、月を抽出できる関数を作成する必要があります:
from django.db import models
from django.db.models import Func
class Month(Func):
function = 'EXTRACT'
template = '%(function)s(MONTH from %(expressions)s)'
output_field = models.IntegerField()
その後、あなたがする必要があるのは
- 各行に月の注釈を付ける
-
values()
を使用して、注釈付きの月ごとに結果をグループ化します -
Sum()
を使用して、合計の合計で各結果に注釈を付けます
重要 :モデルクラスのメタオプションでデフォルトの順序が指定されている場合は、空のorder_by()
を追加する必要があります 句。これは、https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by
order_by()
で言及されているフィールド クエリセットの一部(またはモデルのデフォルトの順序で使用される)は、values()
で特に指定されていない場合でも、出力データを選択するときに使用されます。 電話。これらの追加のフィールドは、「いいね」の結果をグループ化するために使用され、それ以外の場合は同一の結果行が別々に見えるようにすることができます。
よくわからない場合は、空のorder_by()
を追加するだけです。 とにかく悪影響なしに条項。
つまり、
from django.db.models import Sum
summary = (Invoice.objects
.annotate(m=Month('date'))
.values('m')
.annotate(total=Sum('total'))
.order_by())
ここで完全な要点を参照してください:https://gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17
さらに情報が必要な場合:
独自のFuncクラスの作成の詳細:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions
values()句の詳細(句の順序に関してannotate()との相互作用に注意してください):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values
annotate()句とvalues()句がクエリに適用される順序は重要です。 values()句がannotate()の前にある場合、アノテーションは、values()句で記述されたグループ化を使用して計算されます。