2010-11-08 2 views
12

У меня есть Q & A Тип сайта построен в Django со следующими моделями:Django: реализация JOIN с использованием 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 

Есть ли все-таки я мог бы сделать это через ORM Django? Может ли extra() помочь в этом случае?

ответ

26

Это именно то, что делает select_related(). Единственный глюк, что вы должны начать с моделью ответа, а не вопрос, но результат тот же:

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

Теперь каждый объект ответ имеет предварительно сгружен «вопрос» атрибут и доступ к нему больше не ударит по db.

+0

Спасибо, что, если нам нужно имя внешнего ключа в связанной таблице, предположим, что таблица A связана с B и B связана с C. (все таблицы имеют только «имя» и «id»). мы хотим, чтобы каждая запись отображаемой стороны была связана с связанным объектом таблицы C. –

26

Рассмотрите возможность использования models.ForeignKey(Question) вместо 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() 
Смежные вопросы