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