RecursionError: maximum recursion depth exceeded in Odoo 13
RecursionError: maximum recursion depth exceeded in Odoo 13
当我导入 xlsx sheet 时出现 'RecursionError: maximum recursion depth exceeded' 错误。我正在使用 odoo v13。我的目标是当 'log_status' 更改为 'Confirmed' 状态时,应调用一个分配的方法。为此,我正在使用一种写入方法来调用此方法。我的 python 代码如下:
@api.model
def write(self, vals):
record = super(Transaction_log, self).write(vals)
if 'log_status' in vals and vals.get('log_status') == 'Confirmed':
self.action_confirm()
return record
def action_confirm(self):
self.write({'log_status': 'Confirmed'})
self.action_performed.create({'log_status': 'Confirmed', 'trans_log': self.id,
'performed_by': self.env.user.id, 'performed_time': datetime.now()})
return True
提前致谢。
您可以改进的项目很少。
- 将
api.model
更改为 api.multi
。
- 在
self.action_confirm()
方法里面,你又调用了write方法,'log_status'匹配'Confirmed'条件。所以它会递归。
为了避免它,我们可以使用context
来传递虚拟标志。
尝试使用以下代码:
@api.multi
def write(self, vals):
record = super(Transaction_log, self).write(vals)
if 'log_status' in vals and vals.get('log_status') == 'Confirmed' and not self._context.get('by_pass_log_status'):
self.action_confirm()
return record
@api.multi
def action_confirm(self):
self.with_context('by_pass_log_status').write({'log_status': 'Confirmed'})
self.action_performed.create({'log_status': 'Confirmed', 'trans_log': self.id,
'performed_by': self.env.user.id, 'performed_time': datetime.now()})
return True
当我导入 xlsx sheet 时出现 'RecursionError: maximum recursion depth exceeded' 错误。我正在使用 odoo v13。我的目标是当 'log_status' 更改为 'Confirmed' 状态时,应调用一个分配的方法。为此,我正在使用一种写入方法来调用此方法。我的 python 代码如下:
@api.model
def write(self, vals):
record = super(Transaction_log, self).write(vals)
if 'log_status' in vals and vals.get('log_status') == 'Confirmed':
self.action_confirm()
return record
def action_confirm(self):
self.write({'log_status': 'Confirmed'})
self.action_performed.create({'log_status': 'Confirmed', 'trans_log': self.id,
'performed_by': self.env.user.id, 'performed_time': datetime.now()})
return True
提前致谢。
您可以改进的项目很少。
- 将
api.model
更改为api.multi
。 - 在
self.action_confirm()
方法里面,你又调用了write方法,'log_status'匹配'Confirmed'条件。所以它会递归。
为了避免它,我们可以使用context
来传递虚拟标志。
尝试使用以下代码:
@api.multi
def write(self, vals):
record = super(Transaction_log, self).write(vals)
if 'log_status' in vals and vals.get('log_status') == 'Confirmed' and not self._context.get('by_pass_log_status'):
self.action_confirm()
return record
@api.multi
def action_confirm(self):
self.with_context('by_pass_log_status').write({'log_status': 'Confirmed'})
self.action_performed.create({'log_status': 'Confirmed', 'trans_log': self.id,
'performed_by': self.env.user.id, 'performed_time': datetime.now()})
return True