2016-01-13 5 views
5

मान लीजिए इस तरह की एक संरचना है:Django रिलेशनल मॉडल के एक विशिष्ट मूल्य पर क्वेरीसमूह व्याख्या विशेषता

PARTICIPATION_STATUSES = (
    (0, 'No, thanks'), 
    (1, 'I may attend'), 
    (2, 'I\'ll be there'), 
) 

class Model1(models.Model): 
    # ... 

class Model2(models.Model): 
    status = models.PositiveIntegerField(
     _('participation status'), choices=PARTICIPATION_STATUSES)  
    field = models.ForeignKey(Model1, related_name='model1_participation') 

मुझे क्या करना चाहते हैं Model2 वस्तुओं की गिनती के साथ Model1 की प्रत्येक वस्तु टिप्पणी करने के लिए जहां स्थिति के बराबर होती है एक है विशिष्ट मान (स्थिति संख्या यह विशेष उदाहरण है)।

मेरी छद्म कोड में यह दिखाई देगा:

queryset = Model1.objects.all() 
queryset.annotate(declined=Count('model1_participation__status=0')) 
queryset.annotate(not_sure=Count('model1_participation__status=1')) 
queryset.annotate(accepted=Count('model1_participation__status=2')) 

लेकिन मैं इस तरह से क्वेरीसमूह व्याख्या नहीं कर सकते Django status=<n> का समाधान नहीं होता है।

जो मैं चाहता हूं उसे हासिल करने का सही तरीका क्या है?

उत्तर

6

यदि आप Django 1.8 या इससे ऊपर का उपयोग कर रहे हैं तो आप Conditional Aggregations का उपयोग कर सकते हैं, इन्हें annotate क्वेरीसेट्स के लिए काम करना चाहिए।

from django.db.models import IntegerField, Case, When, Count 


queryset = Model1.objects.all() 

queryset = queryset.annotate(
    declined=Count(
     Case(When(model1_participation__status=0, then=1), 
      output_field=IntegerField()) 
    ), 
    not_sure=Count(
     Case(When(model1_participation__status=1, then=1), 
      output_field=IntegerField()) 
    ), 
    accepted=Count(
     Case(When(model1_participation__status=2, then=1), 
      output_field=IntegerField()) 
    ) 
) 
+0

धन्यवाद, यह वास्तव में अच्छा दिखता है, लेकिन मुझे ऑब्जेक्ट्स को एनोटेट करने की आवश्यकता है और कुल नहीं होना चाहिए। क्या आपके पास एनोटोटियोज़ पर कोई विचार है? – pythad

+0

मैंने जवाब संशोधित किया है, इसे अभी भी वैसे ही काम करना चाहिए। इसे एक शॉट दो और मुझे बताएं कि यह कैसे चला जाता है! –

+0

मॉडल को देखते हुए, मुझे नहीं लगता कि 'field_set' सही नाम है (' _set' ऑब्जेक्ट्स के लिए उपयोग किया जाता है, यानी एक विशिष्ट उदाहरण के संबंधित रिकॉर्ड्स को पुनर्प्राप्त करने के लिए)। 'कब (model2__status == ...' बल्कि – Pynchia

संबंधित मुद्दे