You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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存在两个核心问题:

  1. 语法错误:逻辑符'&'后缺少逗号分隔,且total_value、code两个字段名尾部多打了空格,Odoo会识别为不存在的字段直接报错
  2. 逻辑结构错误:运算符排列顺序不对,既没有给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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 12:36:20