2012-04-09 3 views
3

저는 일반적인 쿼리 세트를 캐싱했습니다. 상황에 따라 다른 필드를 기반으로 필터링하고 싶습니다. 내가 처음에 그것을 캐싱의 이점을 잃는다면 평가 된 쿼리 세트를 필터링함으로써 궁금해하고 있습니다; Django는 처음부터 캐시 된 쿼리 세트와 이후에 적용 할 필터를 만드는 데 사용되는 쿼리 세트를 모아서 처음부터 다른 쿼리 세트를 작성합니까?Django는 평가 된 쿼리 세트를 어떻게 필터링합니까?

답변

5

예, 결과가 출력되지 않습니다.

소스에서 이것을 확인할 수 있습니다. filter()_filter_or_exclude()이며 _clone()을 호출 한 다음 쿼리에 추가됩니다. _clone, 당신은 볼 수 있습니다, _result_cache 속성을 설정하지 않습니다.

일반적으로 일반적인 결과를 유지하기 위해 수행 할 수있는 작업이 무엇인지 분명하지 않습니다. 작은 결과 집합이있는 복잡한 쿼리 인 경우 기본 키가 발견 된 결과 중 하나임을 확인하는 SQL을 발행하는 것으로 대체 될 수 있지만 항상 효율적이지는 않으며 일부 상황에서는 (데이터베이스가 캐싱 될 때와 추가 필터를 수행 할 때 사이의 쿼리 결과에 영향을주는 방식으로 변경되는 경우) 의미 론적으로 혼란 스러울 것입니다. 수동으로 ID를 저장하는이 동작을 강제하려면

, 당신이 작업을 수행 할 수 있습니다

pks = SomeObject.objects.filter(...).values_list('pk', flat=True) 
some_of_them = SomeObject.objects.filter(pk_in=pks).filter(...) 
others = SomeObject.objects.filter(pk_in=pks).filter(...) 

당신은 물론 단지 이렇게도 할 수있는 필터링 파이썬에서, 예를 들어,

common = SomeObject.objects.filter(...) 
some_of_them = [m for m in common if m.attribute == 'foo'] 
others = [m for m in common if m.other_attribute == 'bar'] 

(당신은 또한 더 명시 적으로 당신이 선호하는 경우 filter(lambda m: m.attribute == 'foo', common)를 사용하거나 listcommon의 정의를 포장 할 수있다.)에 의해

쿼리를 재발행하는 것은 크기에 많이 의존이 또는 한 여부 필터의 복잡성, 그리고 어떤 인덱스가 존재하는지에 대한 정보를 제공합니다.

관련 문제