Odoo 13中ORM API的onchange在many2many字段上失效
Odoo13销售订单行onchange更新many2many字段无效问题解决
问题描述
在Odoo 13的销售订单行(sale_order_line)表单视图中,修改product_id字段时,通过onchange方法同步更新关联的many2many类型字段mf_ids,但字段值未在视图中生效。
现有实现代码:
@api.onchange("product_id") def _fetch_mf_ids(self): for rec in self: rec.mf_ids = [ (6, 0, [x.id for x in rec.product_id.mf_ids]) ]
调试打印rec.mf_ids时得到非存储值:
product.mf.pgm(<NewId origin=5>, <NewId origin=7>)
原因分析
onchange方法执行时,当前记录处于未保存的临时状态,Odoo会用临时ID(NewId)标记未持久化的记录。直接使用(6, 0, ids)的many2many赋值命令,视图无法正确识别这些临时关联关系,导致更新不生效。
修复方案
方案1:直接赋值记录集(最简可靠)
在onchange上下文里,直接把关联的记录集赋值给mf_ids,Odoo会自动处理底层的命令转换,规避临时ID问题:
@api.onchange("product_id") def _fetch_mf_ids(self): for rec in self: rec.mf_ids = rec.product_id.mf_ids
方案2:使用清空+逐个添加的命令组合
先清空现有值,再用(0, 0, values)命令逐个添加关联记录,确保视图能正确识别:
@api.onchange("product_id") def _fetch_mf_ids(self): for rec in self: # 先清空当前mf_ids rec.mf_ids = [(5, 0, 0)] # 逐个添加产品关联的mf记录 for mf in rec.product_id.mf_ids: rec.mf_ids += [(0, 0, {'id': mf.id})]
方案3:返回domain强制视图刷新
如果前两种方法无效,可通过返回domain的方式,强制视图重新加载mf_ids的当前值:
@api.onchange("product_id") def _fetch_mf_ids(self): for rec in self: rec.mf_ids = rec.product_id.mf_ids # 返回domain触发视图刷新 return {'domain': {'mf_ids': [('id', 'in', self.mf_ids.ids)]}}
内容的提问来源于stack exchange,提问作者NinjaBat
相关产品推荐
相关产品推荐

