Django: реализация JOIN с использованием Django ORM? - PullRequest
16 голосов
/ 08 ноября 2010

У меня есть сайт с вопросами и ответами, созданный в 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

Могу ли я в любом случае сделать это через ORM Джанго?extra() поможет в этом случае?

Ответы [ 3 ]

35 голосов
/ 08 ноября 2010

Попробуйте использовать models.ForeignKey(Question) вместо question_id = IntegerField().

Это оптимальный (более реляционный) способ выразить связь между Вопросами и Ответами, которые вы пытаетесь изобразить.

ЭтоТаким образом, вы можете просто позвонить Answers.objects.filter(question_id=<id>) и получить именно то, что вы ищете.

33 голосов
/ 08 ноября 2010

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

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

Теперь у каждого объекта ответа есть предварительно выбранный атрибут 'вопрос' иэто не ударит дБ снова.

4 голосов
/ 29 декабря 2015
    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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...