जैसे @Alvaro ने GROUP BY
बयान के लिए Django के प्रत्यक्ष समकक्ष का जवाब दिया है:
SELECT actor, COUNT(*) AS total
FROM Transaction
GROUP BY actor
निम्नानुसार values()
और annotate()
विधियों के उपयोग के माध्यम से है:
Transaction.objects.values('actor').annotate(total=Count('actor')).order_by()
हालाँकि एक और बात बताई जानी चाहिए:
यदि मॉडल में डिफॉल्ट ऑर्डरिंग परिभाषित है class Meta
, तो .order_by()
क्लॉज उचित परिणामों के लिए अनिवार्य है। आप बस इसे तब भी नहीं छोड़ सकते जब कोई आर्डर न हो।
इसके अलावा, एक उच्च गुणवत्ता वाले कोड के लिए यह सलाह दी जाती है कि जब कोई न हो तब भी हमेशा एक .order_by()
खंड रखेंannotate()
class Meta: ordering
। इस तरह के दृष्टिकोण से कथन भविष्य में प्रूफ हो जाएगा: यह भविष्य में किसी भी बदलाव की परवाह किए बिना, केवल इच्छित तरीके से काम करेगा class Meta: ordering
।
मैं आपको एक उदाहरण प्रदान करता हूं। यदि मॉडल था:
class Transaction(models.Model):
actor = models.ForeignKey(User, related_name="actor")
acted = models.ForeignKey(User, related_name="acted", null=True, blank=True)
action_id = models.IntegerField()
class Meta:
ordering = ['id']
तब ऐसे दृष्टिकोण WOULDN'T काम करते हैं:
Transaction.objects.values('actor').annotate(total=Count('actor'))
ऐसा इसलिए है क्योंकि Django अतिरिक्त प्रदर्शन करता है GROUP BY
हर क्षेत्र में हैclass Meta: ordering
यदि आप क्वेरी प्रिंट करेंगे:
>>> print Transaction.objects.values(
SELECT "Transaction"."actor_id", COUNT("Transaction"."actor_id") AS "total"
FROM "Transaction"
GROUP BY "Transaction"."actor_id", "Transaction"."id"
यह स्पष्ट होगा कि एकत्रीकरण इरादा के अनुसार काम नहीं करेगा और इसलिए .order_by()
इस व्यवहार को साफ करने और समुचित एकत्रीकरण परिणाम प्राप्त करने के लिए क्लॉज का उपयोग किया जाना चाहिए।
देखें: आधिकारिक Django दस्तावेज़ीकरण में डिफ़ॉल्ट ऑर्डर या order_by () के साथ सहभागिता ।