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

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

关键修改说明

  1. 依赖字段调整:将depends改为line_ids.sale_line_id,因为发票行通过sale_line_id直接关联销售订单行,确保关联关系变化时触发函数
  2. 批量处理优化:用mapped+filtered一次性收集所有目标销售订单行,避免循环遍历的冗余操作
  3. 类型匹配修正:赋值整数40适配数值类型字段,若cost_price_set是字符串字段则保留'40'
  4. 逻辑简化:直接批量调用write完成更新,比循环单个更新更高效且不易出错

额外排查点

  • 检查cost_price_set字段定义:若设置了readonly=True,需移除该属性或使用force_write强制更新
  • 确认当前用户拥有sale.order.line模型的写权限
  • 手动触发函数测试:可在调试模式下调用record.hpp_update(),验证是否能正常更新字段

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 10:13:16