外键关系

时间:2012-11-11 16:56:18

标签: django django-models django-views

我有两个型号

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)

我在想有更好的方法可以做到这一点。或者这已经是一个更好的方法了吗?请告诉我?

2 个答案:

答案 0 :(得分:1)

我认为你想要的是related_name字段的ForeignKey属性。这会创建一个返回Subject对象的链接,并提供一个可用于查询集合的管理器。

因此,要使用此功能,请将foreignkey行更改为:

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

然后使用Subject的实例,我们会调用subj,您可以:

subj.questions.filter(year=2000)

我认为这与您使用的技术的表现差别不大。粗略地说,SQL性能归结为a)是否有索引和b)您发出了多少查询。所以你需要考虑两者。找出模型用法生成的SQL的一种方法是使用SqlLogMiddleware - 或者使用How to show the SQL Django is running中的选项。当您开始跨关系发出查询时,这可能很诱人 - 例如q = Question.objects.get(year=2000, subject__name=SUBJ_MATHS)但除非您密切关注这些类型的查询,否则您可以并且会严重破坏应用的效果。

答案 1 :(得分:0)

Django的查询语法允许您'reach into'相关对象。

past_questions = Pastquestion.objects.filter(year=2000, subject__name=subject_name)