2013-10-24 2 views
3

장고를 사용하여 여러 수준의 관계를 수행하는 방법을 이해하는 데 어려움을 겪고 있습니다. 분명히 내가 for 루프를 사용할 수 있지만 더 효율적인 방법을 찾으려고 노력하고있다. (아마도 원시 SQL에 의지하고있다). 이 모델은 대략입니다 : 그들은 외부 키를 통해 연결하고Django 일대일 관계 따라하기

Subject -> Course -> Module -> Question

(예를 들어, Question 모듈은 Module에 외래 키 포인팅이있다).

다음 작품,하지만 확실히 좋지 않은 매우 느리고 :

subject = "Mathematics" 
courses = Subject.objects.get(name__iexact=subject).course_set.all() 
avg_scores = [] 
for course in courses: 
    modules = course.module_set.all() 
    for module in modules: 
     questions = module.question_set.all().filter(num_attempts__gt=20).filter(avg_score__gt=0).exclude(avg_score__isnull=True).order_by('avg_score') 
     for question in questions: 
      avg_scores.append(question) 

내가 사용하는 SQL이 작업을 수행 할 수있는 작업은 다음과 같습니다

SELECT * FROM question 
INNER JOIN module 
ON question.module_id=module.id 
INNER JOIN course 
ON module.course_id=course.id 
INNER JOIN subject 
ON course.subject_id = subject.id 
WHERE subject.name="Mathematics" 
AND num_attempts > 20 
AND avg_score > 0 

같은 뭔가를 할 수있는 방법이 있나요 : 당신의 SQL 쿼리 SELECT * FROM Model ...을 시작한다면

avg_scores = Subject.objects.get(name__iexact="Mathematics").course_set.module_set.question_set.filter(num_attempts__gt=20).filter(avg_score__gt=0).exclude(avg_score__isnull=True).order_by('avg_score') 

답변

2

다음 장고 쿼리해야 g 전체적으로 Model.objects.filter(...)을 시작하십시오. 따라서이 경우에는 다음과 같은 것이 필요합니다.

Question.objects.filter(module__course__subject__name = 'Mathematics', 
         num_attempts__gt = 20, 
         avg_score__gt = 0).order_by('avg_score') 
+0

감사합니다! 나는 의사의 바른 분야를보고 있지 않았다. 미래의 독자들을 위해, 문서는 다음과 같습니다 : https://docs.djangoproject.com/en/dev/topics/thy-span-relationships 이것은 'for' 루프보다 빠릅니다. 명백한 이유 :-) –