得到了非常复杂的查询(请不要尝试解决示例 - 问题更复杂)
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)
| 归档时间: |
|
| 查看次数: |
2289 次 |
| 最近记录: |