使用自动化代码创建Odoo Stock Move Line时遇psycopg2事务错误求助
问题分析与解决方案
报错原因
psycopg2.errors.InFailedSqlTransaction 本质是当前数据库事务已因前置操作失败而终止,后续SQL命令被忽略。结合你的代码,核心触发点是直接创建stock.move.line不符合Odoo的业务逻辑约束——stock.move.line是stock.move(库存移动)的子记录,必须关联对应的stock.move才能创建,缺失move_id字段会触发校验失败,导致事务异常。
你的代码存在的问题
- 未关联
stock.move:stock.move.line不能独立存在,必须通过move_id字段绑定到一个stock.move记录,你的代码完全缺失这个必填关联字段。 company_id设置不合理:你使用record.partner_id.id作为公司ID,这显然错误——partner_id是合作伙伴,company_id需要传入公司记录的ID,且必须与location_id/location_dest_id所属公司一致。- 硬编码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
相关产品推荐
相关产品推荐

