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

Odoo 17自动化规则创建父子关联记录报错求助

Odoo 17自动化规则创建stock.picking与stock.move父子记录问题修复

报错原因分析

报错ValueError: "'approval.request' object has no attribute 'approval_product_line'"的核心问题是:当前approval.request对象不存在名为approval_product_line的字段。大概率是你记错了产品行的字段名称——Odoo中一对多关联字段通常以_ids结尾(比如approval_product_line_ids),或是模型自定义了其他字段名(比如product_lines)。

修正后的代码实现

以下是调整后的Execute Code逻辑,包含字段名修正、必填字段填充、重复执行防护:

# 仅在审批通过且分类符合条件时执行
if record.request_status == 'approved' and record.category_id.id in (8, 9, 13):
    # 防护:避免重复创建调拨单(需先给approval.request模型新增picking_id关联字段,关联stock.picking)
    if not record.picking_id:
        # 创建父记录:stock.picking
        picking = env['stock.picking'].create({
            'picking_type_id': env.ref('stock.picking_type_out').id,  # 替换为业务所需的调拨类型ID
            'location_id': env.ref('stock.stock_location_stock').id,  # 源仓库ID,按需修改
            'location_dest_id': env.ref('stock.stock_location_customers').id,  # 目标位置ID,按需修改
            'origin': record.name,  # 关联审批单名称,便于溯源
        })
        # 更新审批单关联字段,标记已创建调拨单
        record.write({'picking_id': picking.id})
        
        # 遍历审批单产品行,创建子记录:stock.move
        # 注意:替换为approval.request模型中实际的产品行字段名
        for line in record.approval_product_line_ids:
            env['stock.move'].create({
                'picking_id': picking.id,
                'product_id': line.product_id.id,
                'product_uom_qty': line.quantity,
                'product_uom': line.product_uom.id,
                'location_id': picking.location_id.id,
                'location_dest_id': picking.location_dest_id.id,
                'name': line.product_id.display_name,
            })

关键注意事项

  1. 字段名确认:
    进入开发者模式,通过设置 -> 技术 -> 模型 -> Approval Request -> 字段,找到产品行对应的一对多字段名称,替换代码中的approval_product_line_ids。
  2. 必填字段填充:
    创建stock.picking和stock.move时必须填写所有必填字段,比如picking_type_id、location_id等,可通过引用系统预设记录(env.ref)或直接填写业务对应的ID。
  3. 重复执行防护:
    由于是On Save触发器,每次保存审批单都会触发规则,因此必须新增picking_id关联字段(关联stock.picking),通过if not record.picking_id判断避免重复创建。若无法新增字段,也可通过origin字段查询是否已有对应调拨单:
    existing_picking = env['stock.picking'].search([('origin', '=', record.name)], limit=1)
    if not existing_picking:
        # 执行创建逻辑
    
  4. 多触发器顺序调整:
    若已有其他On Save自动化规则,需调整当前规则的Sequence值(数值越小执行优先级越高),确保逻辑执行顺序符合业务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:32:46