后端方法执行中,设置事务保存点
在odoo中每一个事件,都是生成了一个事务去完成对数据库的操作。
比如我们常见一些长代码在执行的时候,执行到某一行代码时发生了错误,再这之前调用的所有env['model'].create()、或者env['model'].write() 等方法都会被回滚。
现在我在程序设计的时候,有一个需求:有一个勾选批量提交的按钮,在点击后,后台代码是会去另一张表去插数据或改数据,这是因为这些被勾选的记录栏有些是出自同一个‘项目’下的明细,是不允许重复创建的,只会修改已存在的记录。也就是说当我提交三条记录的时候,这三条应该只写入一条记录,所有在循环调用的时候我得实时的获取数据库记录来判断新增和创建、假如之前的创建由于是在事务中,没有写入到数据库表中,那么幻读是必然的。
所以这里我们需要借用odoo的提供的接口
with self.env.cr.savepoint():
在Odoo中,可以使用with self.env.cr.savepoint()来创建一个保存点,以实现在事务执行期间中间提交的效果。这样可以确保在事务执行过程中,部分数据的更改被提交到数据库,从而避免幻读的问题。
代码如下,在每次循环结束的时候会默认提交一次事务的修改
@api.model
def submit_forecast(self, records):
with self.env.cr.savepoint():
for rec_id in records[0]:
pass
还可以使用self.env.cr.commit()进行部分更改的提交
def my_method(self):
with self.env.cr.savepoint():
# 执行部分逻辑
self.field1 = 'Value 1'
self._compute_field2() # 假设这是一个计算字段的方法
self.env.cr.commit() # 提交部分更改
# 执行余下的逻辑
self.field2 = 'Value 2'
self._compute_field1() # 假设这是另一个计算字段的方法
# 最后的提交
self.env.cr.commit()
后端方法执行中,对前端视图通信
前端在调用后端方法的时候,会需要弹出一些提示,比如‘操作成功’等
# 这个适合用来校验提示,因为odoo的每一个事件其实是一个事务,触发这个代码会回滚事务
raise models.ValidationError()
from odoo import models, api, _
from odoo.exceptions import UserError
class MyModel(models.Model):
_name = 'my.model'
@api.model def my_method(self):
# 执行一些操作
# 发送成功提示消息
message = _('操作成功')
self.env['bus.bus'].sendone(
(self._cr.dbname, 'res.partner', self.env.user.partner_id.id),
{'type': 'simple_notification', 'title': _('成功'), 'message': message} )