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, })
关键注意事项
- 字段名确认:
进入开发者模式,通过设置 -> 技术 -> 模型 -> Approval Request -> 字段,找到产品行对应的一对多字段名称,替换代码中的approval_product_line_ids。 - 必填字段填充:
创建stock.picking和stock.move时必须填写所有必填字段,比如picking_type_id、location_id等,可通过引用系统预设记录(env.ref)或直接填写业务对应的ID。 - 重复执行防护:
由于是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: # 执行创建逻辑 - 多触发器顺序调整:
若已有其他On Save自动化规则,需调整当前规则的Sequence值(数值越小执行优先级越高),确保逻辑执行顺序符合业务需求。
内容的提问来源于stack exchange,提问作者Ahmed Haroon
相关产品推荐
相关产品推荐

