2011-03-25 26 views
39

मैं निम्नलिखित Django मॉडल है:Django क्वेरीसमूह रिवर्स विदेशी कुंजी

class Make: 
    name = models.CharField(max_length=200) 

class MakeContent: 
    make = models.ForeignKey(Make) 
    published = models.BooleanField() 

मुझे पता करना चाहते हैं तो यह संभव (एसक्यूएल सीधे लिख बिना) है मुझे एक क्वेरीसमूह कि सभी Make शामिल उत्पन्न करने के लिए के लिए एस और प्रत्येक के संबंधित MakeContent एस जहां published = True है।

+0

क्या आप अपने प्रश्न के बारे में अधिक विशिष्ट हो सकते हैं? – pyeleven

उत्तर

9

Django रिवर्स विदेशी कुंजी लुकअप के लिए select_related() विधि का समर्थन नहीं करता है, इसलिए पाइथन छोड़ने के बिना आप सबसे अच्छा कर सकते हैं दो डेटाबेस प्रश्न हैं। सबसे पहले उन सभी मेक को पकड़ना है जिनमें मेककंटेंट शामिल हैं जहां प्रकाशित = सही है, और दूसरा उन सभी मेककंटेंट को पकड़ना है जहां प्रकाशित = सही है। इसके बाद आपको डेटा को लूप करना होगा और डेटा को व्यवस्थित करना होगा कि आप इसे कैसे चाहते हैं। यहां ऐसा करने के बारे में एक अच्छा लेख है:

http://blog.roseman.org.uk/2010/01/11/django-patterns-part-2-efficient-reverse-lookups/

+18

मुझे नहीं लगता कि मुझे अब इस प्रश्न का उत्तर देने की आवश्यकता है ... –

+2

यह बताए गए दो प्रश्नों को व्यवस्थित करने के लिए prefetch_related() विधि देखें। –

42

हाँ, मुझे लगता है कि आप

make = Make.objects.get(pk=1) 
make.make_content_set.filter(published=True) 

या शायद

make_ids = MakeContent.objects.filter(published=True).values_list('make_id', flat=True) 
makes = Make.objects.filter(id__in=make_ids) 
+3

'.values' को'values_list' द्वारा प्रतिस्थापित किया जाना चाहिए यदि मुझे गलत नहीं है। – exfizik

+1

आपका पहला कोड स्निपेट काम नहीं करता है। यह * एक * बनाने के लिए सभी मेककंटेंट प्राप्त करता है, जहां सभी बनाने के लिए मेककंटेंट की आवश्यकता होती है। _set एक ऑब्जेक्ट के लिए काम करता है लेकिन एक क्वेरीसेट के लिए नहीं। – knite

+0

'flat = True' जोड़ने का क्या मतलब है? आईडी पहले से ही परिभाषा के आधार पर अद्वितीय होंगे, और फिर से सुनिश्चित करेंगे कि वे अद्वितीय हैं, कुछ अतिरिक्त गणना की आवश्यकता हो सकती है। – pintoch

9

मेरे लिए कोड में स्पाइक के शब्दों में जवाब का अनुवाद करते हैं चाहते हैं भविष्य के दर्शक कृपया ध्यान दें प्रत्येक 'मेक' कई के लिए शून्य हो सकता है 'MakeContent'

प्रश्नकर्ता क्वेरी करने के लिए कम से कम एक 'MakeContent' जिसका प्रकाशित = सच है, तो जेसन क्रिस्टा के 2 टुकड़ा सवाल का जवाब के साथ 'बनाने' का अर्थ है, तो ।

टुकड़ा

makes = Make.objects.select_related().filter(makecontent__published=True).distinct() 

के बराबर है लेकिन प्रश्नकर्ता क्वेरी करने के लिए इसका मतलब है अगर सभी 'MakeContent' जिसका प्रकाशित = सच, उसके बाद निम्न ऊपर 'बनाता है',

import operator 
make_ids = [m.id for m in makes if 
    reduce(operator.and_, [c.published for c in m.makecontent_set.all()]) 
] 
makes_query = Make.objects.filter(id__in=make_ids) 
साथ 'निर्माण'

वांछित क्वेरी शामिल है।

4

मुझे पता है कि यह बहुत पुराना सवाल है, लेकिन मैं जवाब दे रहा हूं। जैसा कि मुझे लगता है कि मेरा जवाब दूसरों की मदद कर सकता है। मैंने मॉडल को थोड़ा सा बदल दिया है। मैंने Django 1.8 का उपयोग किया है।

class Make(models.Model): 
    name = models.CharField(max_length=200) 

class MakeContent(models.Model): 
     make = models.ForeignKey(Make, related_name='makecontent') 
     published = models.BooleanField() 

मैंने निम्नलिखित क्वेरीसेट का उपयोग किया है।

Make.objects.filter(makecontent__published=True) 

आशा है कि इससे मदद मिलेगी।

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