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
相关产品推荐
相关产品推荐

