web-dev-qa-db-ja.com

Django:Django ORM?

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()は役に立ちますか?

19
Continuation

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

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

これで、各回答オブジェクトにはプリフェッチされた「質問」属性があり、それにアクセスしてもデータベースに再度アクセスすることはありません。

35
Daniel Roseman

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

これは、描写しようとしている質問と回答の関係を表現するのに最適な(よりリレーショナルな)方法です。

このようにして、Answers.objects.filter(question_id=<id>)を呼び出すだけで、探しているものを正確に取得できます。

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