सरल 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
उपयोग दिखाया गया है। क्या आपने पहले से ही इस तरह के प्रश्नों का परीक्षण किया है? (मैं नहीं है और मैं विश्वास करना चाहता हूँ! :)