2016-09-08 7 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) 

私は3番目のint critリストを追加できません。減らすためにoperator.and_が必要です。私はoperator._orを減らした後に追加する必要がありますが、どうしますか?

答えて

1

reduceを使用する必要はありません:

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

あなたには、いくつかの理由でreduceをしたい場合:

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

または:

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

それかどうかを確認するために私に1つの作業日を教えてください作品 - しかし、おいしい! –

+0

どうもありがとうございます –