सरल Django मॉडल पर विचार करें Eventऔर Participant:
class Event(models.Model):
title = models.CharField(max_length=100)
class Participant(models.Model):
event = models.ForeignKey(Event, db_index=True)
is_paid = models.BooleanField(default=False, db_index=True)
कुल प्रतिभागियों के साथ ईवेंट क्वेरी को एनोटेट करना आसान है:
events = Event.objects.all().annotate(participants=models.Count('participant'))
फ़िल्टर किए गए प्रतिभागियों की गिनती के साथ एनोटेट कैसे करें is_paid=True?
मुझे प्रतिभागियों की संख्या की परवाह किए बिना सभी घटनाओं को क्वेरी करने की आवश्यकता है , उदाहरण के लिए मुझे एनोटेट परिणाम द्वारा फ़िल्टर करने की आवश्यकता नहीं है। यदि 0प्रतिभागी हैं, तो यह ठीक है, मुझे सिर्फ 0एनोटेट वैल्यू की आवश्यकता है।
दस्तावेज़ से उदाहरण यहाँ काम नहीं करता है, क्योंकि यह शामिल नहीं उन लोगों के साथ व्याख्या के बजाय खोज क्वेरी से वस्तुओं 0।
अपडेट करें। Django 1.8 में नई सशर्त अभिव्यक्ति की सुविधा है , इसलिए अब हम इस तरह कर सकते हैं:
events = Event.objects.all().annotate(paid_participants=models.Sum(
models.Case(
models.When(participant__is_paid=True, then=1),
default=0,
output_field=models.IntegerField()
)))
अद्यतन 2. Django 2.0 में नई सशर्त एकत्रीकरण सुविधा है, नीचे दिए गए उत्तर को देखें।
aggregateउपयोग दिखाया गया है। क्या आपने पहले से ही इस तरह के प्रश्नों का परीक्षण किया है? (मैं नहीं है और मैं विश्वास करना चाहता हूँ! :)