You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Odoo 11:如何避免write方法循环调用并实现单次调用

解决Odoo 11中write方法循环调用的问题

你的问题根源很明确:write方法在检测到balance_initial字段被修改时,会触发_upgrading_balance方法,而这个方法里又调用write修改balance_initial,进而再次触发write的逻辑,形成了无限递归循环。

这里有个简单可靠的解决方案,利用Odoo的上下文(context)来标记内部调用,避免递归触发:

@api.multi
def _upgrading_balance(self):
    # 在调用write时添加上下文标记,告知后续write跳过触发逻辑
    self.with_context(skip_upgrade_balance=True).write({'balance_initial': new_balance_initial})
    # 其他逻辑...

@api.multi
def write(self, vals):
    result = super(InheritedHoranetPackageLine, self).write(vals)
    # 只有当外部修改balance_initial,且没有内部标记时才执行_upgrading_balance
    if vals.get('balance_initial') and not self.env.context.get('skip_upgrade_balance'):
        self._upgrading_balance()
    return result

方案原理

  • 当外部代码调用write修改balance_initial时,上下文里没有skip_upgrade_balance标记,所以会正常触发_upgrading_balance。
  • 而_upgrading_balance内部调用write时,通过with_context添加了标记,此时write方法检测到这个标记,就不会再次调用_upgrading_balance,完美切断循环链。

这个方法是Odoo开发中处理递归调用的常用手段,既不破坏原有业务逻辑,又能彻底解决循环问题。

内容的提问来源于stack exchange,提问作者PseudoWithK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 08:03:11