2013-02-26 17 views
8

पर एक मॉडल के लिए एक क्वेरीसेट को देखते हुए, मैं विदेशी कुंजी से संबंधित किसी अन्य मॉडल की क्वेरीसेट प्राप्त करना चाहता हूं। Django परियोजना डॉक्स 'वेबलॉग स्कीमा लें:संबंधित मॉडल की Django Queryset, मूल मॉडल

class Blog(models.Model): 
    name = models.CharField(max_length=100) 
    tagline = models.TextField() 

    def __unicode__(self): 
     return self.name 

class Author(models.Model): 
    name = models.CharField(max_length=50) 
    email = models.EmailField() 

    def __unicode__(self): 
     return self.name 

class Entry(models.Model): 
    blog = models.ForeignKey(Blog) 
    headline = models.CharField(max_length=255) 
    body_text = models.TextField() 
    pub_date = models.DateField() 
    mod_date = models.DateField() 
    authors = models.ManyToManyField(Author) 
    n_comments = models.IntegerField() 
    n_pingbacks = models.IntegerField() 
    rating = models.IntegerField() 

    def __unicode__(self): 
     return self.headline 

मान लीजिए मैं एक author वस्तु है, और मैं हर ब्लॉग है कि लेखक, के लिए लिखा है एक क्वेरीसमूह के रूप में प्राप्त करना चाहते हैं। मैं कुछ ऐसा करता हूं जैसे author_blogs = [entry.blog for entry in author.entry_set]। लेकिन मुझे इस मामले में एक सूची के साथ छोड़ दिया गया है, एक क्वेरीसेट नहीं। क्या कोई तरीका है कि मैं सीधे ओआरएम प्रश्नों के साथ ऐसा कर सकता हूं, इसलिए मैं use_for_related_fields = True के साथ कस्टम एंट्री मैनेजर के माध्यम से इसे सेट कर सकता हूं और author_blogs = author.entry_set.blogs जैसे कुछ कर सकता हूं, और एक क्वेरीसेट के देरी मूल्यांकन आदि के लाभ प्राप्त कर सकता हूं?

संपादित परिदृश्य और समाधान

तो, मैं तथ्य यह है कि मेरे सवाल के आवेदन मैं इसे कैसे ऊपर उत्पन्न है, जिसके लिए डैनियल Roseman की स्थिति भावना का एक बहुत बनाता है से थोड़ी अलग है के बाद एहसास हुआ। मेरी स्थिति वास्तव में author.entry_set.manager_method().blogs की तरह है, जहां manager_method() प्रविष्टि ऑब्जेक्ट्स की क्वेरीसेट देता है। मैंने उसका जवाब स्वीकार कर लिया क्योंकि यह मैंने पाया समाधान को प्रेरित किया:

author_blogs = Blog.objects.filter(entry__in=author.entry_set.manager_method()) 

अच्छी बात यह है कि यह केवल एक डीबी क्वेरी का उपयोग करता है। यह थोड़ा मुश्किल और verbose है, तो मुझे लगता है कि ऊपर की ओर लौटने, लेखक की एक वस्तु विधि के रूप में blogs() परिभाषित करना सबसे अच्छा है।

उत्तर

17

इस के लिए चाल याद रखना है कि यदि आप ब्लॉग की क्वेरीसेट चाहते हैं, तो आपको ब्लॉग मॉडल से शुरुआत करनी चाहिए। फिर, आप संबंधों का पालन करने के लिए डबल-अंडरस्कोर वाक्यविन्यास का उपयोग कर सकते हैं। तो:

author_blogs = Blog.objects.filter(entry__authors=author) 
+0

हाँ, यह सवाल का एक बड़ा समाधान होगा जैसा कि मैंने मूल रूप से इसे देखा था। जैसा कि यह पता चला, मेरी स्थिति थोड़ा अलग थी। मैंने यद्यपि आपका जवाब स्वीकार कर लिया, क्योंकि इससे मैंने जिस समाधान के साथ आया, उसे प्रेरित किया, जिसे मैंने अपने प्रश्न में संपादित किया। धन्यवाद। – acjay

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