Odoo 14:onchange清除关联记录无法删除数据库条目问题
Odoo 14表单视图切换选项时无法清除关联数据库记录问题
问题分析
你遇到的核心问题有两个:
- onchange方法的特性限制:Odoo的
onchange仅处理表单内存中的临时数据变更,不会直接同步到数据库,必须点击「保存」按钮才会将所有变更持久化。 - 模型字段冲突:当前模型继承自
roke.routing,却又定义了同名的routing_id字段,这会导致One2many关联关系混乱,进而影响记录删除逻辑。
解决方案
1. 优先修正字段冲突
删除当前模型中重复定义的routing_id字段:
# 移除这一行重复定义的字段 # routing_id = fields.Many2one("roke.routing", string="工艺路线")
如果确实需要新增关联roke.routing的字段,改为其他名称(比如related_routing_id),并同步修改onchange方法中的触发字段。
2. 优化onchange逻辑
无需单独执行清空操作,直接用新数据替换临时记录即可:
@api.onchange('routing_id') # 若字段名修改,此处同步更新 def onchange_routing_id(self): if self.routing_id: data_list = [] for line in self.routing_id.line_ids: data_list.append((0, 0, { 'process_id': line.process_id.id, 'working_hours_minute': line.working_hours_minute, 'prepare_working_hours': line.prepare_working_hours, 'note': line.note, })) self.routing_line_ids = data_list else: self.routing_line_ids = [(5, 0, 0)]
3. 实时删除数据库记录(可选)
如果必须在切换选项时立即删除数据库中的关联记录(不依赖保存),可以在onchange中结合unlink操作(仅针对已保存的记录):
@api.onchange('routing_id') def onchange_routing_id(self): # 仅当记录已保存到数据库时,删除关联记录 if self.id: self.routing_line_ids.unlink() # 更新表单临时数据 if self.routing_id: data_list = [] for line in self.routing_id.line_ids: data_list.append((0, 0, { 'process_id': line.process_id.id, 'working_hours_minute': line.working_hours_minute, 'prepare_working_hours': line.prepare_working_hours, 'note': line.note, })) self.routing_line_ids = data_list else: self.routing_line_ids = [(5, 0, 0)]
验证步骤
- 修正代码后,重启Odoo服务并升级对应模块
- 打开表单视图切换
routing_id,确认表单内的routing_line_ids正确更新 - 点击保存,检查数据库中
roke.routing.line表的关联记录是否被正确删除/新增
内容的提问来源于stack exchange,提问作者wenlin Fe3O4 x
相关产品推荐
相关产品推荐

