2010-11-08 13 views
12

Ich habe eine Q & Eine Art von Website in Django mit den folgenden Modellen gebaut:Django: Implementierung von JOIN mit 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() 

Ich brauche zusammen, um eine bestimmte Frage angezeigt werden mit ihren Antworten. Normalerweise würde ich 2 Abfragen benötigen, um das zu tun:

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

Ich hoffe, alles mit einer Abfrage abzurufen. In MySQL würde es sein:

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

Gibt es trotzdem kann ich dies durch ORM Django tun? Würde extra() in diesem Fall helfen?

Antwort

26

Dies ist genau das, was select_related() tut. Der einzige gotcha ist, dass Sie mit dem Antwort-Modell zu starten, anstatt Frage, aber das Ergebnis ist das gleiche:

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

Jetzt jede Antwort Objekt hat eine im Vorhinein hergeholt ‚Frage‘ Attribut und Der Zugriff darauf wird die db nicht erneut treffen.

+0

Danke, was ist, wenn wir den Namen des Fremdschlüssels in der zugehörigen Tabelle benötigen, nehmen wir an, Tabelle A ist verwandt mit B und B ist verwandt mit C. (alle Tabellen haben nur "name" und "id"). Wir wollen, dass jeder Eintrag von A Seite durch verwandte C-Tabelle Objekt verbunden wird. –

26

Verwenden Sie models.ForeignKey(Question) statt question_id = IntegerField().

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()