32

次のモデルを使用して、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()この場合、役に立ちますか?

4

4 に答える 4

53

これはまさにselect_related()が行うことです。唯一の問題は、質問ではなく回答モデルから始めなければならないことですが、結果は同じです。

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

現在、各回答オブジェクトには事前に取得された「質問」属性があり、それにアクセスしてもデータベースに再度アクセスすることはありません。

于 2010-11-08T15:54:42.270 に答える
47

models.ForeignKey(Question)の代わりに使用することを検討してくださいquestion_id = IntegerField()

これは、表現しようとしている質問と回答の間の関係を表現するための最適な(より関係のある)方法です。

Answers.objects.filter(question_id=<id>)このように、あなたは単にあなたが探しているものを正確に呼び出して得ることができます。

于 2010-11-08T15:47:09.757 に答える
11
    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()
于 2015-12-29T09:15:44.307 に答える