Odoo 8库存模块Expected singleton错误:拆分发货单打印异常求助
Odoo 8 发货单打印"Expected singleton: stock.production.lot"错误解决方案
问题分析
从你的报错Traceback能明确看出,这是Odoo里常见的单例预期异常:系统在渲染报表时,预期拿到一个stock.production.lot(批次)记录,但实际获取到了两个(4473和4472)。根源在于你自定义的拆分组件把同产品单行拆成两行并分配不同批次后,报表模板的渲染逻辑没跟上——模板里还是按照「单条记录对应单个批次」的逻辑处理,没考虑拆分后一行可能关联多个批次的情况。
需要修改的文件
核心要改的是发货单对应的QWeb报表模板:
- 如果用的是Odoo原生发货单报表,文件是
stock模块下的report/delivery_report.xml - 如果是你自定义的报表,就找你自定义模块里对应的报表XML文件
具体修复步骤
1. 调整报表模板的批次渲染逻辑
找到模板中渲染批次的代码块,通常原生模板里可能是类似这样的写法:
<span t-field="o.lot_id"/>
这种写法只适用于单批次场景,现在要改成支持多批次的处理:
<!-- 处理多批次的显示逻辑 --> <t t-if="o.lot_id"> <span t-foreach="o.lot_id" t-as="lot_item"> <span t-field="lot_item.name"/> <!-- 多个批次时用逗号分隔 --> <t t-if="not loop.last">, </t> </span> </t>
如果你是在循环发货单行(move_lines)的部分渲染批次,要确保是针对每行的单个批次:
<t t-foreach="o.move_lines" t-as="move_line"> <!-- 其他行字段渲染 --> <td> <t t-if="move_line.lot_id"> <!-- 这里确保move_line.lot_id是单条记录 --> <span t-field="move_line.lot_id.name"/> </t> </td> </t>
2. 检查自定义拆分组件的逻辑(关键)
如果模板修改后还是报错,就要回头排查你的拆分组件代码:
- 确保拆分后的每一条新发货单行都只关联单个批次,而不是让一行关联多个批次
- 拆分时要把原行数量拆分,给每个新行分配对应的单个批次记录,保证
move_line.lot_id是单例,而不是多记录集合
验证修复
修改完模板和组件后,重新安装/更新对应的模块,再生成拆分后的发货单、分配批次、打印,应该就能解决这个单例错误了。
内容的提问来源于stack exchange,提问作者LaurensF
相关产品推荐
相关产品推荐

