Django: реализация JOIN с использованием Django ORM?

У меня есть Q & Тип сайта, построенный в Django со следующими моделями:

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() в этом случае?

Ответ 1

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

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

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

Ответ 2

Рассмотрим models.ForeignKey(Question) вместо question_id = IntegerField().

Ответ 3

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