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

Odoo保存记录后计算字段all_taxes未取related字段值问题求助

问题原因分析

咱们先拆解下你遇到的问题,核心出在计算字段的实现方式和Odoo ORM的处理逻辑上:

  1. Compute方法写法不符合Odoo规范
    你的compute_all方法直接对self赋值,没有遍历记录集,还错误调用了self.update()。Odoo的compute方法中,self是记录集(哪怕是单条记录),直接赋值会导致批量操作时出错;更关键的是self.update()会触发额外的写入操作,干扰ORM正常的字段计算和存储流程,这就导致保存时计算的all_taxes值没有正确关联最新的tax_value。

  2. 依赖项不够严谨
    虽然你依赖了tax_value,但tax_value是关联到b_id.tax_value的related字段,有时候直接依赖源字段b_id.tax_value能让ORM更精准地跟踪字段变化;另外tax_old作为计算的参与字段,也应该加入依赖列表,确保它变化时也能触发重新计算。

  3. 存储时序问题
    当你切换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方法仅负责计算字段值,无需手动触发更新
验证步骤
  1. 替换修正后的代码,升级模块。
  2. 打开A的表单,切换b_id,确认all_taxes计算正常。
  3. 保存记录后,重新打开或者查看列表视图,all_taxes应该正确包含tax_value和tax_old的总和。
  4. 测试修改tax_old或者关联的B记录的tax_value,确认all_taxes会自动更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:57:08