如何在旧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
相关产品推荐
相关产品推荐

