2010-11-08 20 views
12

mam Q & rodzaj miejscu wybudowany w Django z następującymi modelami:Django: implementacja JOIN przy użyciu ORM Django?

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

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

trzeba wyświetlić konkretne pytanie wraz z odpowiedziami. Normalnie potrzebuję 2 kwerend, aby to zrobić:

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

Mam nadzieję odzyskać wszystko za pomocą jednego zapytania. W MySQL będzie to:

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

Czy mogę to zrobić za pomocą ORM Django? Czy w tym przypadku pomógłby extra()?

Odpowiedz

26

To jest dokładnie to, co robi select_related(). Jedynym haczyka jest trzeba zacząć od modelu odpowiedzi, a nie pytanie, ale wynik jest taka sama:

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

Teraz każdy obiekt odpowiedź ma wstępnie naciągane „pytanie” atrybut, a dostęp do niego nie spowoduje ponownego uderzenia w bazę danych.

+0

Dzięki, co zrobić, jeśli musimy nazwę klucza obcego w tabeli pokrewnej, załóżmy, że tabela A jest związany z B i B jest związana z C (wszystkie tabele mają tylko „nazwa” i „id”). chcemy dołączyć do każdego wpisu A pokazanej strony przez powiązany obiekt tabeli C. –

26

Rozważ użycie models.ForeignKey(Question) zamiast 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() 
Powiązane problemy