Django以下のモデルで構築されたQ&Aタイプのサイトがあります。
_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]
_
1つのクエリを使用してすべてを取得したいと思っています。 MySQLでは次のようになります。
_SELECT *
FROM Question JOIN Answer ON Question.id=Answer.question_id
WHERE Question.id=1
LIMIT 10
_
とにかく、私はDjangoのORMを通じてこれを行うことができますか?この場合、extra()
は役に立ちますか?
これがまさに select_related() が行うことです。唯一の問題は、質問ではなく回答モデルから始めなければならないことですが、結果は同じです。
answers = Answer.objects.filter(question_id=1).select_related()
これで、各回答オブジェクトにはプリフェッチされた「質問」属性があり、それにアクセスしてもデータベースに再度アクセスすることはありません。
models.ForeignKey(Question)
の代わりにquestion_id = IntegerField()
の使用を検討してください。
これは、描写しようとしている質問と回答の関係を表現するのに最適な(よりリレーショナルな)方法です。
このようにして、Answers.objects.filter(question_id=<id>)
を呼び出すだけで、探しているものを正確に取得できます。
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()