0

我有两个模型

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)

每个主题可以有一个或多个过去的问题,但过去的问题只能有一个主题。我想得到一个主题,并得到一个特定的过去相关的问题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 的一种方法是使用SqlLogMiddleware - 或者使用如何显示 SQL Django 正在运行中的选项当您开始跨关系发出查询时可能很诱人 - 例如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 回答