Odoo动态设置Many2many字段报错:'list'对象无'get'属性
问题原因&修正方案
为啥会报错?
- 字段定义时直接把
onchange方法绑到domain参数上,这是错误用法——Odoo字段的domain只能接受域表达式,或者返回域表达式的普通函数,不能用onchange方法。 onchange方法的返回格式错了,必须返回包含domain键的字典(结构是{'domain': {'目标字段名': 域列表}}),你直接返回列表,系统就会触发'list' object has no attribute 'get'的错误。- 搜索条件里
('id','!=','1')是拿字符串和整数ID对比,类型不匹配,筛选逻辑根本不生效,得改成整数1。 - 没处理
query为空的情况,要是查不到数据,domain就没定义,直接报错。
修正后的代码
allowed_economic_activity_ids = fields.Many2many( 'izi.economic.activity', string='Allowed Economic Activities' ) @api.onchange('allowed_economic_activity_ids', 'invoice_line_ids') def _filtrar_actividades(self): # 筛选掉ID为1的经济活动记录 query = self.env['izi.economic.activity'].search([('id', '!=', 1)]) # 构造可选域:如果有结果就用筛选后的ID集合,否则为空列表 domain = [('id', 'in', query.ids)] if query else [] # 返回标准格式的onchange响应,指定要更新域的字段 return {'domain': {'allowed_economic_activity_ids': domain}}
关键改动说明
- 字段定义里去掉了错误的
domain绑定,改成通过onchange动态设置可选域。 onchange方法返回符合Odoo要求的字典格式,明确指定要修改域的字段名。- 把搜索条件里的字符串
'1'改成整数1,确保筛选逻辑正确。 - 加了兜底处理,就算
query为空也不会触发未定义变量的报错。
内容的提问来源于stack exchange,提问作者Oscar Vardela
相关产品推荐
相关产品推荐

