Odoo 8更新sale.order.line模型cost_price_set字段失败求助
问题分析与解决方案
原代码存在的问题
- 直接访问
record.line_ids.sale_order_id.id仅能获取第一个关联行的订单ID,无法处理多行场景 - 同理,
record.line_ids.product_id.id只能取到第一个关联行的产品ID,逻辑覆盖不全 - 若
cost_price_set为数值类型字段,赋值字符串'40'会导致类型不匹配,无法完成更新 - 循环遍历搜索的方式冗余低效,不符合Odoo的批量操作最佳实践
修正后的代码(以发票模型account.move为例)
@api.depends('line_ids.sale_line_id') def hpp_update(self): # 批量收集所有有效关联的销售订单行 sale_line_ids = self.mapped('line_ids.sale_line_id').filtered(lambda l: l) if sale_line_ids: # 根据字段类型选择赋值:数值类型用40,字符串类型用'40' sale_line_ids.write({'cost_price_set': 40}) return True
关键修改说明
- 依赖字段调整:将
depends改为line_ids.sale_line_id,因为发票行通过sale_line_id直接关联销售订单行,确保关联关系变化时触发函数 - 批量处理优化:用
mapped+filtered一次性收集所有目标销售订单行,避免循环遍历的冗余操作 - 类型匹配修正:赋值整数
40适配数值类型字段,若cost_price_set是字符串字段则保留'40' - 逻辑简化:直接批量调用
write完成更新,比循环单个更新更高效且不易出错
额外排查点
- 检查
cost_price_set字段定义:若设置了readonly=True,需移除该属性或使用force_write强制更新 - 确认当前用户拥有
sale.order.line模型的写权限 - 手动触发函数测试:可在调试模式下调用
record.hpp_update(),验证是否能正常更新字段
内容的提问来源于stack exchange,提问作者Nur Faiz
相关产品推荐
相关产品推荐

