2012-11-11 153 views
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) 

我想有一个更好的方式来做到这一点。或者这已经是一种更好的方式?请告诉?

回答

1

我想你想要什么ForeignKey场的related_name财产。这会创建一个回到Subject对象的链接,并提供一个可用于查询集合的管理器。

因此,要使用此功能,改变外键行:

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),但除非您密切关注这些类型的查询,否则您可能会严重损害应用的性能。

0

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

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

@Æsahættr答案也是一个很好的答案。如果问题的上下文无论如何都需要您拥有Subject对象,那将是更有效的方法。 – markdsievers