에와 쿼리를 최적화하는 것이 가능 쿼리의장고 루프
for student in Student.objects.all():
for course in student.course_set.all():
for grade in course.grade_set.filter(student=student):
# do stuff
양처럼 뭔가에 너무 많은 쿼리를 실행하지 장고를 최적화하는 것은 학생들이 * 코스 * 학년이되는 큰 얻을 수있다.
* 편집 로즈마리의 블로그에서 아이디어를 얻은 후 한 가지 가능성이 있습니다. 스 니펫입니다 만, 기본적으로 내가 (성적) 성적 관심의 마지막 항목에 대한 루프 하나와 루프에 대한 대체
for grade in student.grade_set.order_by('course', 'marking_period').select_related():
if grade.marking_period_id in some_report_input:
# do stuff
내가 (학생, 과정, 표시 기간) 필요한 모든에 대한 참조를 가지고있다. grade.marking_period (다른 쿼리 수행) 대신 marking_period_id와 같은 것을 사용하는 것이 중요했습니다.
트레이드 오프는 코드 가독성입니다. 나는 성적을 걸러 내고 기준에 따라 조직하고 싶었다. 이것은 사소한 것에서 복잡한 것에 이릅니다.
이것은 일반적인 해결책이 아닙니다. 이것이 도움이되지 않을 때가있을 것이라고 확신합니다. 당신이 더 나은 방법을 알고 있다면 의견을 말하십시오.
또 다른 예 : 학생은 과정에 등록됩니다
for student in students:
print student
for department in departments:
print department
failed_grades = Grade.objects.filter(course__department=department,course__courseenrollment__user=student,grade__lte=70)
for failed_grade in failed_grades:
print grade.course
print grade.grade
. 코스에는학과가 있습니다.
여기에 모델을 추가하면 서로 어떻게 연결되는지 이해할 수 있습니다. – marianobianchi