You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数值。

具体解决步骤:

  1. 定位问题代码
    打开你服务器上的自定义模块文件:/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。

  2. 修复字段赋值错误
    找到所有把模型记录对象直接传给外键字段的地方,替换为对应的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,
          # 其他字段...
      }
      
  3. 验证修复并更新模块

    • 修改代码后,重启你的Odoo服务,确保新代码加载生效。
    • 进入Odoo后台开启调试模式,找到bi_pos_pay_later模块并点击更新。
    • 测试关闭包含已开票客户订单的POS会话,确认错误不再触发。
  4. 额外排查(若修复后仍有问题)

    • 检查自定义模块是否重写了_create_invoice_receivable_lines或其他POS会话过账相关方法,确保所有外键字段(如partner_id、account_id等)都传递ID数值而非对象。
    • 可在调试模式下临时添加打印语句,输出创建MoveLine时的vals字典,确认是否还有其他对象类型的字段值未修正。

内容的提问来源于stack exchange,提问作者Alsayyed Cosmetics

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 21:42:36