0
点赞
收藏
分享

微信扫一扫

浅谈下odoo中的onchange

在Odoo中使用onchange方法时,确实存在一些细节和特殊情况,尤其是在处理One2many字段和跨模型数据更新时。以下是关于你提到的情况的一些解释和建议:

  1. 关于临时对象和数据回滚
  • onchange方法中,默认情况下只有对当前模型(例如,在表单视图上)的字段进行的更改才是临时的。这意味着,如果用户取消操作,这些更改会被回滚。
  • 当通过onchange方法中的代码操作其他模型的记录时(例如,使用.search()方法),这些操作不是在临时环境中进行的。因此,这些更改即使在用户取消当前操作时,也不会被回滚。
  1. 处理One2many字段的特殊性
  • 当你通过表头上的.test_line_ids之类的字段访问One2many字段时,你操作的是临时对象。这些对象在用户提交(保存)之前不会永久更改数据库。
  • 如果在One2many字段的onchange中更改了主表(如self.order_id.name='xx'),这种更改不会生效,因为onchange方法主要用于更新当前视图上的字段,而不是用于持久化数据到数据库。
  1. 解决方法
  • 如果你需要在子表的onchange方法中更新主表数据,并希望这些更改立即生效,可以考虑使用服务器端方法。例如,定义一个自定义方法来处理跨模型的数据更新,确保数据的一致性和正确保存。
  • 使用.search(),.browse()或类似的方法更改数据时,请注意事务的完整性和数据的一致性。虽然这种方法可以更新数据库中的数据,但它们也绕过了Odoo的标准视图和模型机制,可能导致未预期的副作用。
  1. 总结
  • 在使用onchange方法时,理解其工作方式和限制是非常重要的。它主要用于在用户界面上实时更新数据,而不是用于跨模型的复杂数据操作。
  • 在处理跨模型数据更新时,考虑使用更适合这种操作的Odoo机制,如自定义服务器端方法或按钮操作。
  • 操作临时对象的时候丢弃才会给回滚,但是如果通过.对象的方式或者search的方式修改数据后丢弃是不会回滚的。
举报

相关推荐

0 条评论