0

私は2つのモデルを持っています

class Subject(models.Model):
    name = models.CharField(max_length=100,choices=COURSE_CHOICES)
    created = models.DateTimeField('created', auto_now_add=True)
    modified = models.DateTimeField('modified', auto_now=True)
    syllabus = models.FileField(upload_to='syllabus')
    def __unicode__(self):
        return self.name

class Pastquestion(models.Model):
    subject=models.ForeignKey(Subject)
    year =models.PositiveIntegerField()
    questions = models.FileField(upload_to='pastquestions')
    def __unicode__(self):
        return str(self.year)

各サブジェクトには1つ以上の過去の質問を含めることができますが、過去の質問には1つのサブジェクトしか含めることができません。主題を取得し、特定の関連する過去の質問を取得したいと思いyearます。私は主題を取得し、それに関連する過去の質問を取得することを考えていました。

現在、件名と年が次のような特定の件名に対応する過去の質問を取得するようにコードを実装しています。

this_subject=Subject.objects.get(name=the_subject)
thepastQ=Pastquestion.objects.get(year=2000,subject=this_subject)

これを行うにはもっと良い方法があると思っていました。それとも、これはすでにより良い方法ですか?教えてください?

4

2 に答える 2

1

あなたが欲しいのは畑のrelated_name財産だと思います。ForeignKeyこれにより、オブジェクトへのリンクが作成Subjectされ、セットのクエリに使用できるマネージャーが提供されます。

したがって、この機能を使用するには、外部キー行を次のように変更します。

subject=models.ForeignKey(Subject, related_name='questions')

次に、Subjectを呼び出すインスタンスを使用して、次のsubjことができます。

subj.questions.filter(year=2000)

これは、あなたが使用した手法とそれほど変わらないと思います。大まかに言えば、SQLのパフォーマンスは、a)インデックスがあるかどうか、およびb)発行しているクエリの数に要約されます。したがって、両方について考える必要があります。モデルの使用法が生成しているSQLを確認する1つの方法は、SqlLogMiddlewareを使用することです。あるいは、SQLDjangoが実行されていることを示す方法のオプションを試してみてください。q = Question.objects.get(year=2000, subject__name=SUBJ_MATHS)これらのタイプのクエリを注意深く監視すると、アプリのパフォーマンスが大幅に低下する可能性があります。

于 2012-11-11T17:08:51.587 に答える
0

Djangoのクエリ構文を使用すると、関連するオブジェクトに「到達」できます。

past_questions = Pastquestion.objects.filter(year=2000, subject__name=subject_name)
于 2012-11-11T17:10:01.237 に答える