Odoo执行多发票操作时抛出Expected singleton异常如何解决?
Odoo批量操作发票触发Singleton错误的解决办法
这个错误的核心原因是:你执行的发票操作方法默认只支持单条account.invoice记录,但你传入了两条记录(481、482),方法内部直接访问了记录的字段或属性(比如self.partner_id、self.amount_total),Odoo不允许对多条记录的集合直接做这种单条记录的操作。
解决办法如下:
遍历记录集处理每条记录
如果是你自定义的方法,把原本针对单条记录的逻辑改成遍历记录集,示例代码:def custom_invoice_action(self): for invoice in self: # 替换成你原本的操作逻辑,比如开票、生成凭证 invoice.action_invoice_open()这样每条记录会被单独处理,不会触发singleton错误。
检查方法的装饰器
有些方法可能误用了@api.one(Odoo 10及以后推荐用@api.multi),或者用了@api.multi但内部没做批量处理。如果是自定义方法,把@api.one改成@api.multi然后添加遍历逻辑;如果是第三方模块的方法,可以继承重写,加入遍历逻辑适配批量操作。排查界面操作的触发逻辑
如果是通过界面选中多条发票点击按钮触发的错误,要确认按钮绑定的动作或方法是否支持批量。如果是原生按钮,可能是你自定义的业务逻辑冲突了原生方法的批量处理,检查下你继承的视图、动作或者重写的方法是否破坏了原有批量逻辑。避免直接访问单条记录属性
在所有可能处理多条记录的方法里,不要直接写self.field_name,如果需要获取所有记录的字段值,用self.mapped('field_name')得到值列表;如果需要操作字段,针对每条记录单独处理。
内容的提问来源于stack exchange,提问作者ady.phyton.odoo
相关产品推荐
相关产品推荐

