2012-12-03 3 views

답변

1

여기 호출 qs.filter()qs 승/아무 상관이없는 새로운 검색어 세트를 생성 :이 예에서 한 번만

예를 액세스 데이터베이스를합니다.
또한 the doc에 따르면 qscurrent은 특정 작업 때까지 평가되지 않습니다. 당신은 파이썬으로 필터링 할 수 있습니다

+0

forloop에서 일부 조작을 수행 할 경우, 배열의 요소로 쿼리. 이것을 피하는 방법? – szaman

+0

@szaman 아, 네 점이 보인다. 하나의 쿼리 세트가 하나의 SQL에 직접 매핑되기 때문에 쉬운 방법은 없습니다. – okm

+0

@szaman ORM 최적화의 경우, 사용법에 따라 다르지만, 프리 페치, 캐시, 파이썬 필터링, 요구 사항 간소화 등을 할 수 있습니다. – okm

1

:

귀하의 검색어와 배열이 큰 경우
qs = Model.objects.all() 

for element in array: 
    current = filter(lambda x: x.name==element, qs) 

그러나,이 비효율적이다. 당신이 구축하려는 경우

qs = Model.objects.filter(name__in=array) 
0

: name 값의 일부만을 포함

from collections import defaultdict # 
qs = Model.objects.all() 
grouped = defaultdict(list) 
for obj in qs: 
    grouped[obj.name].append(obj) 

for element in array: 
    current = grouped[element] 

array 경우, 그것은의 검색어를 제한하는 의미가 있습니다 또는, 그룹은 요소에 의해 당신의 검색어 수 데이터베이스에 한 번의 조회로 조회가 이루어지면 Q 오브젝트를 사용해야 할 것입니다.

from django.db.models import Q 
q = Q() 
for element in array: 
    q &= Q(name=element) 
qs = Model.objects.filter(q) 
관련 문제