2013-11-26 2 views
1

필터링 할 여러 프로젝트 유형을 선택할 수있는 양식이 있습니다. 예를 들어 프로젝트 유형이 "연구", "교육"및 "평가"라고 가정하십시오. 난 그냥 생성하는 문자열 인 필터() 입력없이이를 구축하는 방법을 잘 모르겠어요django Q 객체로 쿼리 세트 만들기

projects.filter(Q(type__type="Research") | Q(type__type="Training")) 

:

기본적으로 내가 무엇을 찾고 있어요처럼 Q 객체를 사용하여 검색어 세트를 구축하다 오류 :

querystring = "" 
for t in types: 
    querystring += " | Q(type__type="+t+")" 
projects.filter(querystring) ## produces error: "ValueError: too many values to unpack" 

그래서 Q 개체를 사용하여 쿼리 세트를 만드는 방법은 무엇입니까?

답변

6

실제 Q() 쿼리 개체와 관계가없는 문자열을 작성하는 중입니다. 첫 번째 Q() 인스턴스 시작하고 더 추가

query = Q(type__type=types[0]) 
for t in types[1:]: 
    query |= Q(type__type=t) 
projects.filter(query) 

또한이 작업을 수행 할 functools.reduce() function을 사용할 수

from functools import reduce 
from operator import or_ 

query = reduce(or_, (Q(type__type=t) for t in types)) 
projects.filter(query) 

reduce() 호출하지 위의 for 루프와 완전히 같은 일; 일련의 Q(..) 개체를 가져와 | 또는 작업과 결합 된 모든 부분이 포함 된 더 큰 쿼리로 결합하십시오.