Odoo 14企业版POS关闭会话过账报错(ProgrammingError: can't adapt type 'res.partner')解决咨询
解决Odoo 14关闭POS会话时的
psycopg2.ProgrammingError: can't adapt type 'res.partner'错误 从你的错误栈和场景描述来看,这个问题的核心原因是自定义模块bi_pos_pay_later的代码中,把res.partner的记录对象直接赋值给了需要存储ID的数据库字段——PostgreSQL无法直接存储Odoo的模型对象,只能识别对应的ID数值。
具体解决步骤:
定位问题代码
打开你服务器上的自定义模块文件:/opt/odoo14/custom_addons/bi_pos_pay_later/models/pos_session.py,重点查看第35行附近的action_pos_session_closing_control方法,以及该方法调用后涉及创建会计分录(MoveLine)的逻辑。出错的典型场景是:构造
account.move.line的字段值时,代码写了类似'partner_id': partner_object的语句,而非传递partner_object.id。修复字段赋值错误
找到所有把模型记录对象直接传给外键字段的地方,替换为对应的ID值。举个例子:- 错误写法:
# 这里的partner是res.partner对象,直接赋值会触发数据库适配错误 receivable_vals = { 'partner_id': partner, 'account_id': account.id, # 其他字段... } - 正确写法:
# 传递partner的ID,同时处理对象为空的边界情况 receivable_vals = { 'partner_id': partner.id if partner else False, 'account_id': account.id, # 其他字段... }
- 错误写法:
验证修复并更新模块
- 修改代码后,重启你的Odoo服务,确保新代码加载生效。
- 进入Odoo后台开启调试模式,找到
bi_pos_pay_later模块并点击更新。 - 测试关闭包含已开票客户订单的POS会话,确认错误不再触发。
额外排查(若修复后仍有问题)
- 检查自定义模块是否重写了
_create_invoice_receivable_lines或其他POS会话过账相关方法,确保所有外键字段(如partner_id、account_id等)都传递ID数值而非对象。 - 可在调试模式下临时添加打印语句,输出创建MoveLine时的vals字典,确认是否还有其他对象类型的字段值未修正。
- 检查自定义模块是否重写了
内容的提问来源于stack exchange,提问作者Alsayyed Cosmetics
相关产品推荐
相关产品推荐

