Odoo中Invalid leaf错误排查:多对多字段过滤异常
解决Odoo Many2many字段筛选触发的Invalid leaf ValueError
刚看到你遇到的这个问题,我之前在配置Odoo关联字段筛选时也踩过类似的坑。你定义的Many2many字段加了domain来过滤未停用的分析配置,但系统抛出了ValueError: Invalid leaf,大概率是domain的语法或者字段匹配出了问题,咱们一步步来解决:
错误原因分析
Odoo在解析domain表达式时,会把每个筛选条件(也就是所谓的"leaf")拆成三元组(字段名, 操作符, 值)处理。如果这个三元组格式不对、字段名不存在,或者有多余的无效字符,就会触发这个错误。看你给出的domain[('Deactivated', '=',False )],至少有两个可能的问题:
False后面多了一个多余空格,导致解析时识别出错- 关联模型
olims.analysis_profile里的字段名可能不是Deactivated(Odoo模型字段通常用小写下划线命名,比如deactivated)
具体解决方案
1. 修正Domain的语法格式
先把domain里多余的空格去掉,保证每个元素的分隔清晰,正确的字符串形式domain应该是这样:
fields.Many2many( string='AnalysisProfile', comodel_name='olims.analysis_profile', relation='ar_to_analysisprofile', domain="[('Deactivated', '=', False)]" )
注意False前后的空格要规范,逗号后面跟一个空格,不要有多余的末尾空格。
2. 确认关联模型的字段名
去检查olims.analysis_profile模型的定义,看看布尔字段的名字到底是Deactivated还是小写的deactivated。如果模型里定义的是:
deactivated = fields.Boolean(string='Deactivated')
那你得把domain里的字段名改成小写,否则Odoo找不到对应的字段,自然会报错:
fields.Many2many( string='AnalysisProfile', comodel_name='olims.analysis_profile', relation='ar_to_analysisprofile', domain="[('deactivated', '=', False)]" )
3. 改用Lambda函数定义Domain(可选)
如果字符串形式的domain总是出问题,你可以试试用lambda函数来定义,这样能避免字符串解析的潜在问题,写法如下:
fields.Many2many( string='AnalysisProfile', comodel_name='olims.analysis_profile', relation='ar_to_analysisprofile', domain=lambda self: [('Deactivated', '=', False)] )
这种方式在需要动态筛选的时候也更灵活,不过你的场景是静态筛选,两种方式都能用。
验证修改
改完之后重启Odoo服务,更新模块,再打开对应的视图,应该就能正常加载筛选后的Many2many字段了。
内容的提问来源于stack exchange,提问作者Muhammad Sajid
相关产品推荐
相关产品推荐

