सबसे पहले, आपको एक फंक्शन बनाना होगा जो आपके लिए महीना निकाल सके:
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
वैल्यूज () क्लॉज पर विवरण, (इस पर ध्यान दें कि यह क्लॉज के क्रम के संबंध में एनोटेट () के साथ कैसे इंटरैक्ट करता है):https://docs.djangoproject.com/en/1.9/topics/db/aggregation/#values
<ब्लॉककोट>जिस क्रम में एनोटेट () और वैल्यू () क्लॉज किसी क्वेरी पर लागू होते हैं, वह महत्वपूर्ण है। यदि मान () क्लॉज एनोटेट () से पहले आता है, तो एनोटेशन की गणना वैल्यू () क्लॉज द्वारा वर्णित ग्रुपिंग का उपयोग करके की जाएगी।