超过最大递归深度 Odoo
maximum recursion depth exceeded Odoo
class SomeOrder(models.Model):
_inherit = 'some.order'
@api.multi
def write(self, vals):
result = super(SomeOrder, self).write(vals)
for rec in self:
rec.update_other_order()
return result
@api.model
def update_pos_quatation(self):
# my logic.write
class OtherOrder(models.Model):
_inherit = "other.order"
@api.multi
def write(self, vals):
result = super(OtherOrder, self).write(vals)
if 'amount_paid' in vals:
self.update_Some_order()
return result
@api.model
def update_some_order(self):
# my logic.write
我有方法在最后将 vals 写入销售订单,但我覆盖了另一种更新销售订单的方法的销售写入方法。问题是我得到“超过最大递归深度”,因为 update_sales_order 触发了一些方法。我怎样才能避免这个递归错误?可能我需要添加一些上下文来编写方法
所以基本上这两种方法都用 write 互相调用。
这里你只需要一个终止或中断条件。
例如,如果您在某个特殊字段值更改时调用另一个写入逻辑,则不会再次更改该字段值:
@api.multi
def write(self, vals):
res = super(MyModel, self).write(vals)
if 'my_trigger_field_name' in vals:
self.my_other_logic(vals)
@api.multi
def my_other_logic(self, vals):
my_trigger_field_value = vals.get('my_trigger_field_name')
if my_trigger_field_value == 1:
self.write({'another_field': 2})
或者如果您必须更改必须写入的值,只需使用上下文来停止递归:
@api.multi
def write(self, vals):
res = super(MyModel, self).write(vals)
if 'stop_write_recursion' not in self.env.context:
self.my_other_logic(vals)
@api.multi
def my_other_logic(self, vals):
# get values to write
self.with_context(stop_write_recursion=1).write(other_values)
class SomeOrder(models.Model):
_inherit = 'some.order'
@api.multi
def write(self, vals):
result = super(SomeOrder, self).write(vals)
for rec in self:
rec.update_other_order()
return result
@api.model
def update_pos_quatation(self):
# my logic.write
class OtherOrder(models.Model):
_inherit = "other.order"
@api.multi
def write(self, vals):
result = super(OtherOrder, self).write(vals)
if 'amount_paid' in vals:
self.update_Some_order()
return result
@api.model
def update_some_order(self):
# my logic.write
我有方法在最后将 vals 写入销售订单,但我覆盖了另一种更新销售订单的方法的销售写入方法。问题是我得到“超过最大递归深度”,因为 update_sales_order 触发了一些方法。我怎样才能避免这个递归错误?可能我需要添加一些上下文来编写方法
所以基本上这两种方法都用 write 互相调用。
这里你只需要一个终止或中断条件。
例如,如果您在某个特殊字段值更改时调用另一个写入逻辑,则不会再次更改该字段值:
@api.multi
def write(self, vals):
res = super(MyModel, self).write(vals)
if 'my_trigger_field_name' in vals:
self.my_other_logic(vals)
@api.multi
def my_other_logic(self, vals):
my_trigger_field_value = vals.get('my_trigger_field_name')
if my_trigger_field_value == 1:
self.write({'another_field': 2})
或者如果您必须更改必须写入的值,只需使用上下文来停止递归:
@api.multi
def write(self, vals):
res = super(MyModel, self).write(vals)
if 'stop_write_recursion' not in self.env.context:
self.my_other_logic(vals)
@api.multi
def my_other_logic(self, vals):
# get values to write
self.with_context(stop_write_recursion=1).write(other_values)