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