Odoo13为many2one字段设置复杂逻辑domain的配置问题
Odoo 13 many2one字段复杂Domain配置正确方案
Odoo Domain采用前缀波兰表示法编写规则:逻辑运算符&(AND)、|(OR)、!(NOT)必须写在它所作用的两个运算项之前,未手动标注逻辑符时默认隐式使用AND连接,复杂逻辑必须严格按运算顺序排列运算符,否则会出现优先级错乱。
目标逻辑拆解
你需要实现的SQL筛选条件等价于如下逻辑块:
(A OR B OR (C AND D)) AND E
各子条件对应关系:
- A:
code in (19, 34)- B:
type = 118- C:
total_value > 0- D:
type not in (66, 96)- E:
code not in (66, 67)
原有写法错误说明
你之前写的Domain存在两个核心问题:
- 语法错误:逻辑符
'&'后缺少逗号分隔,且total_value、code两个字段名尾部多打了空格,Odoo会识别为不存在的字段直接报错 - 逻辑结构错误:运算符排列顺序不对,既没有给
C AND D做正确分组,也没有把最外层的AND E作用到前面整个OR逻辑块上,最终运算顺序和目标逻辑不符。
正确Domain写法
按前缀表示法规则,最外层是(A OR B OR (C AND D))和E做AND运算,逐层向内拆分运算符顺序,最终写法如下:
[ '&', '|', '|', ('code', 'in', (19, 34)), ('type', '=', 118), '&', ('total_value', '>', 0), ('type', 'not in', (66, 96)), ('code', 'not in', (66, 67)) ]
如果需要写成单行字符串格式(比如写在视图XML属性里),直接去掉换行和缩进即可:
"['&','|','|',('code', 'in', (19,34)),('type', '=', 118),'&',('total_value', '>', 0),('type', 'not in', (66,96)),('code', 'not in', (66,67))]"
编写注意事项
- 复杂Domain不要直接写单行,按缩进分层排列,每个逻辑运算符对应一层缩进,可以快速排查结构错误
- 字段名必须和模型里定义的字段名完全一致,不能带多余空格、大小写错误
- 逻辑验证可以借助开发者模式的高级筛选功能:手动选好对应条件,保存筛选规则后系统会自动生成标准Domain结构,可直接复用避免手写出错
- 数值字段做比较运算时注意NULL值特性:SQL里NULL和任何值做比较都返回UNKNOWN,如果你的
total_value字段允许为空,需要NULL值也参与匹配的话要额外补判断条件。
内容的提问来源于stack exchange,提问作者reyhane janboori
相关产品推荐
相关产品推荐

