2012-02-07 16 views
33

मैंने trfunk से django 1.4 में prefetch_related() को आजमाया है और इसे रिवर्स लुकअप प्रीफेच करने के लिए नहीं बना सकता है।Django: prefetch_related() रिवर्स रिलेशनशिप लुकअप का पालन करता है?

मेरे सरलीकृत मॉडल (प्रत्येक पुस्तक के कई कीमतों है):

class Book(models.Model): 
    # some fields 

class Price(models.Model): 
    book = models.ForeignKey(Book) 

मेरा विचार के प्रश्न:

AttributeError: Cannot find 'price' on Book object, 'price' is an invalid parameter to prefetch_related() 

कैसे करें:

books = Book.objects.prefetch_related('price') 

फिर, मैं AttributeError संदेश मिला इसे काम करने लायक बनाओ? धन्यवाद।

+14

किताबें = Book.objects.prefetch_related ('price_set') – Acute

+2

@Jonathanz: आप 'prefetch_related ('price_set') यानी स्वीकार किए जाते हैं जवाब' – Medorator

उत्तर

61

एक संबंधित नाम निर्धारित करें:

class Price(models.Model): 
    book = models.ForeignKey(Book, related_name='prices') 

और फिर इसे का उपयोग करें:

books = Book.objects.prefetch_related('prices') 
+31

आपका जवाब मुझे FOO_set की याद दिलाता है तो सुधार भी कर सकते हैं के रूप में अपनी टिप्पणी रखना चाहिए हो .prefetch_related ('price_set')। बीटीडब्ल्यू, बहुत बहुत धन्यवाद – Tianissimo

+1

मैं इसे खोल में पुन: पेश नहीं कर पा रहा हूं। अभी भी अलग प्रश्न पूछता है, मैं शामिल होने की उम्मीद कर रहा था। – pdvyas

+0

हैलो! मैंने यह भी कोशिश की है, लेकिन जैसा कि @pdvyas ने कहा, अलग प्रश्न हैं। यह शामिल नहीं होता है ... – Anton

0

आप संबंध के लिए एक related_name परिभाषित किया है नहीं करते हैं, रिवर्स संबंध _set संलग्न है। इस मामले में जब एक वस्तु (जैसे some_book.price_set.all()) से रिवर्स संबंध तक पहुँचने है, लेकिन यह भी prefetch_related पर काम करता है:

books = Book.objects.prefetch_related('price_set') 

ध्यान दें कि यह फिल्टर से अलग लगता है, जो करता अन्य मॉडल का नाम स्वीकार बिना _set (उदाहरण के लिए Books.objects.filter(price__currency='EUR'))।

उपर्युक्त 1.11.8 के साथ परीक्षण किया गया था (इस विशिष्ट कोड पर नहीं, बल्कि मेरे अपने समान कोड पर)।

वैकल्पिक रूप से, आप related_name जोड़ सकते हैं, जैसा कि ऊपर ऊपर जॉन पोस्चो द्वारा दिखाया गया है।

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