2010-11-27 3 views
1

당신은 일부 모델의 경우 :장고 최적화 질문

class Teacher(models.Model): 
    name = models.CharField(max_length=50) 

class Student(models.Model): 
    age = models.PositiveIntegerField() 
    teacher = models.ForeignKey(Teacher, related_name='students') 

그리고 당신은 다음과 같이 사용 : 끝내

>>> student = Student.objects.get(pk=1) 
>>> student.teacher.name # This hits the database 
'Some Teacher' 
>>> student.teacher.name # This doesn't (``teacher`` is cached on the object) 
'Some Teacher' 

합니다. Django는 데이터베이스를 남용하지 않고 다시 사용할 수 있도록 관련 객체를 캐시합니다. 이처럼 사용하는 경우

그러나 :

>>> teacher = Teacher.objects.get(pk=1) 
>>> for student in teacher.students.all(): # This hits the database 
...  print(student.age) 
... 
8 
6 
>>> for student in teacher.students.all(): # This does too (obviously) 
...  print(student.age) 
... 
8 
6 

캐싱 또는 관련 개체에 대한 효율적인 접근이 방향이 없습니다.

내 질문은 따라서이다 : 당신이 할 수처럼 효율적인 방법으로 역 액세스 관련 개체에 내장 (또는 비 문제 방법) 위의 student.teacher 예에서, (캐시 방식)이 있습니까?

는 는

내가 반복해서 같은 관련 개체에 액세스해야하는 여러 방법과 모델을 가지고 있기 때문입니다하려는 이유는 그래서 12 개 쿼리를해야 페이지가 외설 약 30

답변

2

과 끝 어떤 내장 된 방법도 없습니다. 이 문제에 관해서는 on my blog에 대해 역방향 관계에 액세스하는 것을 최적화하는 기술을 썼습니다.

+0

우수한 :-)이 특정 문제에 대한 장고 자신의 문서에 대한 링크입니다! 내가 새로운 문제에 부딪 칠 때마다, 당신은 나보다 오래 똑같은 문제를 겪었다. 아이러니하게도 이름이 다니엘이지만 미야기 씨와 같습니다. 다시 감사드립니다. – orokusaki

+0

이 경우 select_related()가 작동하지 않습니까? – jMyles

+0

@Justin - 아니,'select_related'는'OneToOne' 관계에서만 역으로 작동하고 Django 1.2 +에서만 작동합니다. – orokusaki

1

orokusaki,

당신은

students = teacher.students.all() 

그리고 그냥 루프에 대한 귀하의 학생들를 사용 파이썬 변수로 검색어 세트를 캐시해야합니다.

다음은

http://docs.djangoproject.com/en/1.1/topics/db/optimization/#understand-cached-attributes

+0

(굉장한 이름, 첫째로) - 고마워. 문제는 쿼리가 동일한 요청 동안 여러 제어 장소에서 실행되고 있지만 같은 클래스에서 실행되었다는 것입니다. 따라서 실제 관련 모델에서 캐시 된 버전을 만들 수있는 대답이있었습니다 (예 :''foo_teacher._cache_students = teacher.students.all()''<단순화 된 버전입니다. – orokusaki