2012-11-11 3 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 개체에 대한 링크가 만들어지고 집합을 쿼리하는 데 사용할 수있는 관리자가 제공됩니다.

그래서,이 기능을 사용하려면 외래 키 라인을 변경하려면 : 우리가 subj 전화 할게 Subject의 인스턴스와 다음

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

을 수행 할 수 있습니다

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

장고의 쿼리 구문을 사용하면 'reach into '관련 개체를 사용할 수 있습니다.

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

@ Æsahættr 대답도 좋습니다. 문제의 문맥에 어쨌든 Subject 객체가 필요하면보다 효율적인 방법입니다. – markdsievers