web-dev-qa-db-fra.com

Django: implémenter de rejoindre l'utilisation Django ORM?

J'ai un type de site Q & A intégré Django avec les modèles suivants:

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

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

J'ai besoin d'afficher une question spécifique avec ses réponses. Normalement, j'aurais besoin de 2 questions pour le faire:

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

J'espère récupérer tout en utilisant une requête. Dans MySQL, ce serait:

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

Y a-t-il de toute façon que je puisse faire cela via Orm de Django? extra() aide dans ce cas?

19
Continuation

C'est exactement ce qu'est Select_Related () fait. Le seul gotcha est que vous devez commencer avec le modèle de réponse plutôt que de se poser, mais le résultat est le même:

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

Maintenant, chaque objet de réponses a une attribution "question" pré-extraite et l'accédant d'accès à nouveau sur le DB.

35
Daniel Roseman

Pensez à utiliser models.ForeignKey(Question) au lieu de question_id = IntegerField().

C'est la façon optimale (plus relationnelle) d'exprimer la relation entre les questions et les réponses que vous essayez de décrire.

De cette façon, vous pouvez simplement appeler Answers.objects.filter(question_id=<id>) et obtenir exactement ce que vous recherchez.

36
baklarz2048
    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()
6
Saurav Biswas