Odoo创建stock.move.line无法正常处理库存预留问题求助
问题分析与解决
问题1:手动创建stock.move.line后库存转移无法完成
你创建stock.move.line时仅关联了picking_id,但未关联对应的stock.move(即缺失move_id参数),导致Odoo库存流程无法识别该明细对应的转移需求,进而无法完成验证;取消时的报错是因为系统认为你试图取消一个未实际预留的库存。
问题2:stock.quant操作报错'int' object has no attribute 'categ_id'
_get_available_quantity和_update_available_quantity方法需要传入记录对象(如product.product实例),而非整数ID。你直接传入product_id、location_id等整数,方法内部尝试访问对象属性(如categ_id)时自然会报错。
修复方案
方案1:规范创建stock.move.line,触发系统自动预留
创建move.line时必须关联对应的stock.move,让Odoo按标准流程处理库存预留:
product_id = 465 location_id = 8 product_qty = 1 lot_id = 118 # 获取对应的picking和move(假设picking是record) picking = record # 从picking中筛选对应产品的库存转移move(根据业务调整筛选逻辑) stock_move = picking.move_ids.filtered(lambda m: m.product_id.id == product_id)[0] # 创建move.line并关联move_id env['stock.move.line'].create({ 'company_id': 1, 'picking_id': picking.id, 'move_id': stock_move.id, # 关键:关联对应的stock.move 'lot_id': lot_id, 'date': picking.date, 'location_dest_id': 5, 'location_id': location_id, 'product_uom_qty': product_qty, 'product_uom_id': 32, 'product_id': product_id }) # 触发picking的库存预留逻辑 picking.action_assign()
方案2:修正stock.quant的调用方式(不推荐,易导致数据不一致)
如果必须手动操作quant,需先将ID转换为对应对象:
product_id = 465 location_id = 8 product_qty = 1 lot_id = 118 # 将ID转换为对应的记录对象 product = env['product.product'].browse(product_id) location = env['stock.location'].browse(location_id) lot = env['stock.production.lot'].browse(lot_id) # 检查可用库存并更新 if env['stock.quant']._get_available_quantity(product, location, lot, strict=True) >= product_qty: env['stock.quant']._update_available_quantity( product, location, -product_qty, lot_id=lot, package_id=False, owner_id=False )
注意:优先使用方案1,直接操作stock.quant会绕过Odoo的库存校验逻辑,容易导致库存数据异常。
内容的提问来源于stack exchange,提问作者Ryan
相关产品推荐
相关产品推荐

