2016-09-08 2 views
0

있어 매우 복잡한 쿼리를 줄이고장고 Q 객체 (예를 해결하려고하지 마십시오 - 문제가 더 복잡하다)

crit=[] 
crit.append(Q(firstcond = name) | Q(firstcond__isnull = True) 
crit.append(Q(secondcond = name) | Q(firstcond__isnull = True) 

MyObject.objects.filter(reduce(operator.and_, crit)) 

이 예상대로 작동합니다

WHERE (firstcond = name OR firstcond IS NULL) AND (secondcond = name OR secondcond IS NULL) 

을하지만 지금 일부 OR가 필요합니다 :

WHERE ((firstcond = name OR firstcond IS NULL) AND (secondcond = name OR \ 
secondcond IS NULL)) OR (third = value) 

operator.and_가 감소하므로 세 번째 int crit 목록을 추가 할 수 없습니다. 나는 operator._or를 줄여야 만합니다.하지만 어떻게?

답변

1

reduce 사용할 필요가 없습니다 : 그것은 있는지 확인하는 하나의 작업 일

MyObject.objects.filter(reduce(operator.or_([reduce(operator.and_, crit), Q(third = value)])) 
+0

나에게주십시오 :

MyObject.objects.filter(reduce(operator.and_, crit) | Q(third = value)) 

또는 : 당신이 어떤 이유로 reduce을 원하는 경우에

crit = (Q(firstcond = name) | Q(firstcond__isnull = True)) & (Q(secondcond = name) | Q(firstcond__isnull = True)) | Q(third = value) MyObject.objects.filter(crit) 

을 작품 -하지만 맛있어 보인다! –

+0

대단히 고마워요. 그게 내가 필요한거야. –