2011-11-11 16 views
7

साथ संबंध मैं 4 मॉडल है और मैं एक उन दोनों के बीचDjango रिवर्स select_related

ModelA

class ModelA(models.Model): 
    product = models.ForeignKey(ModelB) 
    group = models.ForeignKey(Group) 

में शामिल होने को पुनः प्राप्त करने ModelB

class ModelB(models.Model): 
    title = models.CharField() 

ModelC

चाहते
class ModelC(models.Model): 
    product = models.ForeignKey(ModelB) 
    group = models.ForeignKey(ModelD) 

ModelD

class ModelD(models.Model): 
    name = models.CharField() 

अब मैं सब मेरी ModelA वस्तुओं साथ शामिल हो गए ModelB, ModelC और ModelD एसक्यूएल में यह करने के लिए बहुत आसान बात है चाहता हूँ। बस टेबल के बीच जुड़ें। Django ORM के साथ मैं अटक गया क्योंकि मैं केवल आगे संबंध कर सकता हूं।

मैं इस

ModelA.objects.all().select_related(product) 

कर रहा हूँ लेकिन मैं ModelC शामिल नहीं हो सकते मैं पहले से ही this article पढ़ा है, लेकिन मैं नहीं एक साधारण बात करने के लिए मेरा बड़ा सूची पर लूप करना चाहते हैं,! और मैं केवल एक बार डेटाबेस हिट करना चाहता हूं।

मैं Django के अंतिम संस्करण का उपयोग कर रहा हूं और मुझे उम्मीद है कि इसके लिए पहले से ही एक समाधान है, मुझे पता नहीं है।

धन्यवाद।

+0

क्या आपने ऐसा कुछ करने की कोशिश की है: 'ModelA.objects.all()।select_related ('product', 'product__modelc', 'product__modelc__group') ' ? इसे उत्तर के रूप में पोस्ट नहीं करना क्योंकि मुझे बिल्कुल यकीन नहीं है कि यह वही होगा जो आप चाहते हैं। –

+1

@ बिल्डाजा: 'select_related' * समर्थन ट्रैवर्सल नहीं है। –

उत्तर

8

prefetch_related पर दस्तावेज़ देखें। यह केवल इस समय देव है, लेकिन Django 1.4 के साथ मारा जाएगा। यदि आप प्रतीक्षा कर सकते हैं या आप ट्रंक पर चल सकते हैं। आप इसका उपयोग करने में सक्षम होंगे।

इस बीच, आप django-batch-select आज़मा सकते हैं। यह अनिवार्य रूप से एक ही उद्देश्य परोसता है।

3

संपादित करें: समस्या को फिर से पढ़ने के बाद, समाधान इतना आसान नहीं है।

docs कहते हैं:

select_related एकल महत्वपूर्ण संबंधों तक ही सीमित है - विदेशी कुंजी और एक-से-एक।

Django 1.4 क्वेरीसेट्स में prefetch_related विधि होगी, जिसे आपको निश्चित रूप से पढ़ना चाहिए। ऐसा लगता है कि आप इसे एक ही प्रश्न में नहीं कर पाएंगे, लेकिन आप इसे 2 या 3 में करने में सक्षम हो सकते हैं। आपको निश्चित रूप से देखना चाहिए, और यदि आपको वास्तव में इसकी आवश्यकता है तो देव संस्करण में अपग्रेड करना चाहिए।

यदि आप dev संस्करण का उपयोग नहीं कर सकते हैं और 1.4 के लिए इंतजार नहीं कर सकते हैं, django भी custom SQL queries का समर्थन करता है।

+0

सही। 'prefetch_related' यह सब एक क्वेरी में नहीं करता है जैसे select_related। बस, ऐसा करने का कोई तरीका नहीं है। इसका मतलब एन + 1 क्वेरी समस्या है जहां संबंधित वस्तुओं के माध्यम से लूपिंग प्रत्येक लूप के लिए एक क्वेरी में परिणाम देती है। इसके बजाए, यह पहले संबंध के लिए एक ही प्रश्न करता है और फिर बाद में उपयोग के परिणाम को कैश करता है। –

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