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

Odoo11如何将计算字段值设置为另一普通字段的默认值

问题原因

你之前写的默认值不生效,是因为字段默认值在记录实例化阶段触发,此时overtime_w的计算逻辑还未执行,关联的attendance_ids也还未加载,拿到的是空值。

实现步骤

1. 新增辅助标记字段

新增一个隐藏的布尔字段,用来判断用户是否手动修改过overtime_w_edit:

is_overtime_edited = fields.Boolean(default=False)

2. 补全计算字段依赖并调整计算逻辑

原计算方法缺少@api.depends装饰器无法自动触发重算,同时要修正原计算方法未遍历多记录的问题,在计算逻辑中同步未编辑状态的overtime_w_edit值:

@api.multi
@api.depends('attendance_ids.overtime_50_numeric')
def _compute_t_overtime_w(self):
    for record in self:
        overtime_val = sum(record.attendance_ids.mapped('overtime_50_numeric')) / 100
        record.overtime_w = overtime_val
        # 未被手动编辑时,自动同步计算值
        if not record.is_overtime_edited:
            record.overtime_w_edit = overtime_val

3. 新增onchange逻辑监听手动修改

用户修改overtime_w_edit时自动标记为已编辑,后续不再同步计算字段的值:

@api.onchange('overtime_w_edit')
def _onchange_overtime_edit(self):
    self.is_overtime_edited = True

可选优化(无需辅助字段版本)

如果你不想新增辅助字段,可以在模型的write方法中做判断,逻辑如下:

@api.multi
def write(self, vals):
    # 如果写入字段包含overtime_w_edit,说明用户手动修改过,在上下文中加标记
    if 'overtime_w_edit' in vals:
        self = self.with_context(overtime_edited=True)
    return super(你的模型类名, self).write(vals)

然后调整计算逻辑,判断上下文标记即可:

if not self._context.get('overtime_edited', False):
    record.overtime_w_edit = overtime_val

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:24:03