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

使用自动化代码创建Odoo Stock Move Line时遇psycopg2事务错误求助

问题分析与解决方案

报错原因

psycopg2.errors.InFailedSqlTransaction 本质是当前数据库事务已因前置操作失败而终止,后续SQL命令被忽略。结合你的代码,核心触发点是直接创建stock.move.line不符合Odoo的业务逻辑约束——stock.move.line是stock.move(库存移动)的子记录,必须关联对应的stock.move才能创建,缺失move_id字段会触发校验失败,导致事务异常。

你的代码存在的问题

  1. 未关联stock.move:stock.move.line不能独立存在,必须通过move_id字段绑定到一个stock.move记录,你的代码完全缺失这个必填关联字段。
  2. company_id设置不合理:你使用record.partner_id.id作为公司ID,这显然错误——partner_id是合作伙伴,company_id需要传入公司记录的ID,且必须与location_id/location_dest_id所属公司一致。
  3. 硬编码ID易失效:直接写死5、8这类ID,在不同环境(测试/生产)或数据变更后会失效,建议用搜索查询替代。

正确创建stock.move.line的方式

在Odoo中,必须先创建stock.move,再关联创建对应的stock.move.line,或通过stock.move自动生成明细行。

方式1:手动创建关联的stock.move和stock.move.line

# 1. 先创建库存移动主记录(stock.move)
move_vals = {
    'name': '内部调拨移动',
    'company_id': record.company_id.id,  # 使用当前记录所属公司
    'date': record.date,
    'location_id': 8,  # 源库存地点ID
    'location_dest_id': 5,  # 目标库存地点ID
    'product_id': 465,
    'product_uom': 32,  # 产品单位ID
    'product_uom_qty': 1,
    'picking_type_id': env['stock.picking.type'].search([('code', '=', 'internal')]).id,  # 内部调拨类型
}
stock_move = env['stock.move'].create(move_vals)

# 2. 创建对应的库存移动明细行(stock.move.line)
line_vals = {
    'move_id': stock_move.id,  # 关联到上面创建的stock.move
    'location_id': 8,
    'location_dest_id': 5,
    'product_id': 465,
    'product_uom_id': 32,
    'product_uom_qty': 1,
    'qty_done': 1,  # 如果是已完成的调拨,设置实际完成数量
}
env['stock.move.line'].create(line_vals)

方式2:通过stock.move自动生成明细行

Odoo在创建stock.move时,会自动生成对应的stock.move.line,只需确保stock.move的参数完整:

# 创建stock.move时自动生成move.line
move_vals = {
    'name': '自动生成明细的调拨',
    'company_id': record.company_id.id,
    'date': record.date,
    # 用搜索替代硬编码ID,更健壮
    'location_id': env['stock.location'].search([('name', '=', '原材料仓')], limit=1).id,
    'location_dest_id': env['stock.location'].search([('name', '=', '生产车间')], limit=1).id,
    'product_id': env['product.product'].search([('default_code', '=', 'MAT001')], limit=1).id,
    'product_uom': env['uom.uom'].search([('name', '=', 'KG')], limit=1).id,
    'product_uom_qty': 1,
    'picking_type_id': env['stock.picking.type'].search([('code', '=', 'internal')], limit=1).id,
}
stock_move = env['stock.move'].create(move_vals)

# 自动生成的明细行可通过stock_move.move_line_ids获取
# stock_move.move_line_ids  # 包含已创建的stock.move.line记录

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 17:40:40