与reduce嵌套的django Q对象

Tom*_*ina 1 django

得到了非常复杂的查询(请不要尝试解决示例 - 问题更复杂)

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))
Run Code Online (Sandbox Code Playgroud)

这按预期工作:

WHERE (firstcond = name OR firstcond IS NULL) AND (secondcond = name OR secondcond IS NULL)
Run Code Online (Sandbox Code Playgroud)

但现在我需要一些 OR:

WHERE ((firstcond = name OR firstcond IS NULL) AND (secondcond = name OR \
secondcond IS NULL)) OR (third = value)
Run Code Online (Sandbox Code Playgroud)

我无法添加第三个 int crit 列表,因为在 reduce 中使用 operator.and_。我必须在reduce之后添加operator._or,但是如何?

ser*_*erg 11

无需使用reduce

crit = (Q(firstcond = name) | Q(firstcond__isnull = True)) & (Q(secondcond = name) | Q(firstcond__isnull = True)) | Q(third = value)
MyObject.objects.filter(crit)
Run Code Online (Sandbox Code Playgroud)

如果您reduce出于某种原因想要:

MyObject.objects.filter(reduce(operator.and_, crit) | Q(third = value))
Run Code Online (Sandbox Code Playgroud)

或者:

MyObject.objects.filter(reduce(operator.or_([reduce(operator.and_, crit), Q(third = value)]))
Run Code Online (Sandbox Code Playgroud)