सरल Django मॉडल Event
और Participant
पर विचार करें:Django में गिनती एनोटेशन के लिए ऑब्जेक्ट्स को फ़िल्टर कैसे करें?
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
की आवश्यकता है।
example from documentation यहां काम नहीं करता है, क्योंकि इसमें 0
के साथ टिप्पणी करने के बजाय क्वेरी से वस्तुओं को शामिल नहीं किया गया है।
अद्यतन। Django 1.8 नई conditional expressions feature है, तो अब हम इस तरह कर सकते हैं:
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 नई Conditional aggregation सुविधा है, नीचे दिए गए the accepted answer देखते हैं।
यह शानदार लग रहा है! :) – rudyryk
बीटीडब्ल्यू, दस्तावेज लिंक द्वारा ऐसा कोई उदाहरण नहीं है, केवल 'कुल' उपयोग दिखाया गया है। क्या आपने पहले से ही ऐसे प्रश्नों का परीक्षण किया है? (मैंने नहीं किया है और मैं विश्वास करना चाहता हूं! :) – rudyryk
मेरे पास है। वे काम करते हैं। मैं वास्तव में एक अजीब पैच मारा जहां एक पुरानी (सुपर-जटिल) सबक्वायरी ने Django 2.0 में अपग्रेड करने के बाद काम करना बंद कर दिया और मैं इसे एक सुपर-सरल फ़िल्टर-गिनती के साथ बदलने में कामयाब रहा। एनोटेशन के लिए एक बेहतर इन-डॉक उदाहरण है, इसलिए मैं इसे अभी खींचूंगा। – Oli