2012-01-31 2 views
4

나는 다음과 같은 모델이있는 경우 :Django의 RelatedManager가 대상 객체에서 조회가 호출 된 객체를 캐시하지 않는 이유는 무엇입니까?

class Fubar(models.Model): 
    name = models.CharField() 

class Related(models.Model): 
    fubar = models.ForeignKey(Fubar) 

내가 .related_set 사용 관련에 액세스하는 경우 ORM 마술 부모 FUBAR 객체를 캐시 것으로 기대 :

3 개 쿼리 결과
fubar = Fubar.objects.all()[0] 
related = fubar.related_set.all()[0] 
related.fubar 

, 이 컨텍스트에서 relatedManager를 호출 한 동일한 객체로 related.fubar를 최적화 할 수 있기 때문에 2에서 만 결과를 얻을 것으로 기대합니다.

+1

이것은 django 1.5에서 수정되었습니다. https://docs.djangoproject.com/en/dev/releases/1.5-beta-1/#caching-of-related-model-instances – Darb

답변

2

난이 (어쩌면 마법의 감소를 제외하고) 작동하지 않는 이유를 모르겠어요 동안, 당신은 쉽게 장고가 자동으로 검색합니다 prefetch_related을 소개하고 1.4에서

fubar.related_set.select_related('fubar')[0] 
+0

도움이됩니다. fubar의 정확한 객체/상태가되기를 바랬습니다. 현재 인스턴스에서 fubar 객체에 대한 다른 정보를 가져와 캐싱하고 있기 때문입니다. fubar_id를 사용하여 개체 및 조회의 자체 캐시를 유지 관리해야합니다. – Darb

0

로 추가 쿼리를 피할 수있는, 단일 일괄 처리에서 지정된 각 조회에 대한 관련 개체.