Pertama, Anda harus membuat Fungsi yang dapat mengekstrak bulan untuk Anda:
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()
Setelah itu yang perlu Anda lakukan adalah
- beri keterangan pada setiap baris dengan bulan
- kelompokkan hasil berdasarkan bulan beranotasi menggunakan
values()
- menganotasi setiap hasil dengan jumlah agregat dari total menggunakan
Sum()
Penting :jika kelas model Anda memiliki urutan default yang ditentukan dalam opsi meta, maka Anda harus menambahkan order_by()
kosong ayat. Ini karena https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#interaction-with-default-ordering-or-order-by
Bidang yang disebutkan dalam
order_by()
bagian dari kumpulan kueri (atau yang digunakan dalam pengurutan default pada model) digunakan saat memilih data keluaran, meskipun tidak ditentukan lain dalamvalues()
panggilan. Kolom tambahan ini digunakan untuk mengelompokkan hasil “suka” dan dapat membuat baris hasil yang identik tampak terpisah.
Jika Anda tidak yakin, Anda bisa menambahkan order_by()
yang kosong klausa tetap tanpa efek samping.
yaitu
from django.db.models import Sum
summary = (Invoice.objects
.annotate(m=Month('date'))
.values('m')
.annotate(total=Sum('total'))
.order_by())
Lihat inti lengkapnya di sini:https://Gist.github.com/alvingonzales/ff9333e39d221981e5fc4cd6cdafdd17
Jika Anda membutuhkan informasi lebih lanjut:
Detail tentang membuat kelas Func Anda sendiri:https://docs.djangoproject.com/en/1.8/ref/models/expressions/#func-expressions
Detail tentang klausa values(), (perhatikan bagaimana ia berinteraksi dengan annotate() sehubungan dengan urutan klausa):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values
urutan penerapan klausa annotate() dan values() ke kueri adalah signifikan. Jika klausa values() mendahului annotate(), anotasi akan dihitung menggunakan pengelompokan yang dijelaskan oleh klausa values().