2010-11-08 10 views
12

मेरे पास एक क्यू & है जो निम्नलिखित मॉडल के साथ Django में निर्मित एक प्रकार की साइट है:Django: Django ORM का उपयोग कर जॉइन लागू करना?

class Question(models.Model): 
    title = models.CharField(max_length=70) 
    details = models.TextField() 

class Answer(models.Model): 
    question_id = IntegerField() 
    details = models.TextField() 

मुझे इसके उत्तरों के साथ एक विशिष्ट प्रश्न प्रदर्शित करने की आवश्यकता है। आम तौर पर मुझे ऐसा करने के लिए 2 प्रश्नों की आवश्यकता होगी:

Question.objects.get(id=1) 
Answer.objects.get(question_id=1)[:10] 

मैं एक प्रश्न का उपयोग करके सबकुछ पुनः प्राप्त करने की उम्मीद कर रहा हूं। MySQL में यह होगा:

SELECT * 
FROM Question JOIN Answer ON Question.id=Answer.question_id 
WHERE Question.id=1 
LIMIT 10 

क्या वैसे भी मैं Django के ORM के माध्यम से ऐसा कर सकता हूं? extra() इस मामले में मदद करेगा?

उत्तर

26

यह ठीक है select_related() करता है। केवल पकड़ लिया आप उत्तर मॉडल, बल्कि सवाल से साथ शुरू कर दिया है कि है, लेकिन परिणाम एक ही है:

answers = Answer.objects.filter(question_id=1).select_related() 

अब प्रत्येक जवाब वस्तु एक पहले से लाया 'सवाल' विशेषता है, और है इसे एक्सेस करने से फिर डीबी नहीं मारा जाएगा।

+0

धन्यवाद, अगर हमें संबंधित तालिका पर विदेशी कुंजी का नाम चाहिए, तो मान लें कि तालिका ए बी से संबंधित है और बी सी से संबंधित है (सभी तालिकाओं में केवल "नाम" और "आईडी" है)। हम संबंधित सी टेबल ऑब्जेक्ट द्वारा दिखाए गए पक्ष की प्रत्येक प्रविष्टि में शामिल होना चाहते हैं। –

26

question_id = IntegerField() के बजाय models.ForeignKey(Question) का उपयोग करने पर विचार करें।

1
class Question(models.Model): 
     title = models.CharField(max_length=70) 
     details = models.TextField() 

    class Answer(models.Model): 
     question = models.ForeignKey('Question') 
     details = models.TextField() 

    id = <whatever_id>  
    answers = Question.objects.get(id=id).answer_set.all() 
संबंधित मुद्दे