我有两个型号
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)
我在想有更好的方法可以做到这一点。或者这已经是一个更好的方法了吗?请告诉我?
答案 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)