Odoo 10技术咨询:如何获取库存移动行对应的销售订单及关联表?
库存移动行与销售订单的关联逻辑
嘿,刚好对Odoo的这套关联逻辑熟得很,来给你唠清楚~
首先得明确:Odoo并没有专门的直接关联表来连接stock.move.line(库存移动行)和sale.order(销售订单),但你可以通过三层外键的链式关联,轻松拿到你要的对应关系,路径是:stock.move.line → stock.move → sale.order.line → sale.order
具体字段对应关系
stock.move.line里的move_id字段,直接关联到stock.move(库存移动)的主键idstock.move里的sale_line_id字段,关联到sale.order.line(销售订单行)的主键idsale.order.line里的order_id字段,最终关联到sale.order(销售订单)的主键id
实用的查询方式
直接数据库SQL查询
如果你需要从数据库层面直接拉取数据,这条联表查询可以帮你获取每张出库交货单对应的原始销售订单信息:
SELECT sml.id AS 库存移动行ID, sp.name AS 交货单编号, so.name AS 销售订单编号, res_partner.name AS 客户名称, sol.name AS 订单行描述 FROM stock_move_line sml JOIN stock_move sm ON sml.move_id = sm.id JOIN sale_order_line sol ON sm.sale_line_id = sol.id JOIN sale_order so ON sol.order_id = so.id JOIN stock_picking sp ON sml.picking_id = sp.id JOIN res_partner ON so.partner_id = res_partner.id WHERE sp.picking_type_id = (SELECT id FROM stock_picking_type WHERE code = 'outgoing'); -- 仅筛选出库类交货单
Odoo模块内ORM查询
如果是在Odoo模块开发中使用,用ORM链式调用就能快速拿到关联数据:
# 示例:获取指定交货单对应的所有销售订单信息 delivery_slip = self.env['stock.picking'].browse(你的交货单ID) for move_line in delivery_slip.move_line_ids: # 链式获取关联的销售订单 sale_order = move_line.move_id.sale_line_id.order_id if sale_order: # 这里可以提取销售订单的任意字段 print(f"交货单 {delivery_slip.name} 关联销售订单:{sale_order.name},客户:{sale_order.partner_id.name}")
小提醒
要注意哦,不是所有库存移动都来自销售订单(比如内部调拨、采购入库退货等),所以在查询时最好加上判断,避免因为sale_line_id为空导致的报错~
内容的提问来源于stack exchange,提问作者M.E.




