2012-11-11 192 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