Odoo保存记录后计算字段all_taxes未取related字段值问题求助
问题原因分析
咱们先拆解下你遇到的问题,核心出在计算字段的实现方式和Odoo ORM的处理逻辑上:
Compute方法写法不符合Odoo规范
你的compute_all方法直接对self赋值,没有遍历记录集,还错误调用了self.update()。Odoo的compute方法中,self是记录集(哪怕是单条记录),直接赋值会导致批量操作时出错;更关键的是self.update()会触发额外的写入操作,干扰ORM正常的字段计算和存储流程,这就导致保存时计算的all_taxes值没有正确关联最新的tax_value。依赖项不够严谨
虽然你依赖了tax_value,但tax_value是关联到b_id.tax_value的related字段,有时候直接依赖源字段b_id.tax_value能让ORM更精准地跟踪字段变化;另外tax_old作为计算的参与字段,也应该加入依赖列表,确保它变化时也能触发重新计算。存储时序问题
当你切换b_id并保存A记录时,tax_value(store=True的related字段)的数据库更新可能滞后于all_taxes的计算,加上compute方法的写法问题,导致计算时用了旧的tax_value值,最终保存的all_taxes只包含tax_old。
解决办法
修改A模型中的compute_all方法,按照Odoo的规范实现,同时修正代码里的小笔误:
class A(models.Model): _name="a" b_id = fields.Many2one("b") # 修正笔误:原代码写的是field.Many2one tax_old = fields.Float() tax_value = fields.Float(string="Tax", related='b_id.tax_value', store=True) all_taxes = fields.Float(compute='compute_all') # 修正旧写法:原用的_compute,建议统一用compute @api.depends('b_id.tax_value', 'tax_old') # 直接依赖源字段+参与计算的tax_old def compute_all(self): # 遍历记录集,处理每条记录(符合Odoo ORM规范) for rec in self: rec.all_taxes = rec.tax_value + rec.tax_old # 移除self.update():compute方法仅负责计算字段值,无需手动触发更新
验证步骤
- 替换修正后的代码,升级模块。
- 打开A的表单,切换
b_id,确认all_taxes计算正常。 - 保存记录后,重新打开或者查看列表视图,
all_taxes应该正确包含tax_value和tax_old的总和。 - 测试修改
tax_old或者关联的B记录的tax_value,确认all_taxes会自动更新。
内容的提问来源于stack exchange,提问作者Tessnim
相关产品推荐
相关产品推荐

