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

如何在旧API的write()函数中调用新API定义的函数?

在Odoo旧API的write()中调用新API的compute_amount()方法

问题背景

你现有的旧API风格write()方法和新API装饰的compute_amount()方法代码如下:

旧API write():

def write(self, cr, uid, ids, vals, context=None):
    self.compute_amount()

新API compute_amount():

@api.one
@api.depends('tax_id','price_subtotal','od_month','product_uom_qty','price_unit','discount')
def compute_amount(self):
    sum=0
    for tax in self.tax_id:
        sum=sum+(tax.amount*self.price_subtotal)
    self.od_tax_amount=sum

解决方案

直接在旧API里调用新API方法会出问题,因为新旧API的记录集处理逻辑不同。我们需要把旧API的参数转换为新API的记录集格式,再调用目标方法。修改后的write()代码如下:

def write(self, cr, uid, ids, vals, context=None):
    # 先执行父类的write逻辑,确保传入的vals先保存到数据库
    res = super(YourModelName, self).write(cr, uid, ids, vals, context=context)
    
    # 将旧API的参数转换为新API的记录集对象
    records = self.browse(cr, uid, ids, context=context)
    
    # 调用新API的compute_amount方法,@api.one会自动遍历每条记录执行计算
    records.compute_amount()
    
    return res

关键说明

  • 先保存vals再计算:调用父类write能确保你要更新的字段(比如price_subtotal、discount这些compute_amount依赖的字段)已经是最新值,这样计算出来的od_tax_amount才准确。
  • 转换为新API记录集:self.browse()把旧API的游标、用户ID、记录ID转换成新API的记录集,这样@api.one装饰器才能正确识别并处理每条记录。
  • @api.one的作用:这个装饰器会自动遍历记录集中的每条记录,不需要你手动写循环处理每个ID,直接调用records.compute_amount()就会对所有传入的记录执行计算逻辑。

如果你的业务场景需要先计算再保存(比如某些字段依赖计算结果),可以调整执行顺序,但通常先保存更新的字段再计算是更合理的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:40:58