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