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

Odoo跨模型迁移Many2one字段报can't adapt type错误

报错原因

Odoo中Many2one字段在数据库层存储的是关联记录的整数类型主键ID,直接读取self.warehouse_id得到的是ware.houses模型的记录集对象,psycopg2无法将Python模型对象直接转换为SQL可识别的写入参数,因此抛出类型适配错误。

修改方案
  • 给Many2one字段赋值时,取关联记录集的.id属性获取数据库存储的整数ID即可;如果关联字段为空,传False表示空值,避免空对象取id抛出属性错误。
  • unit_price是配置了@api.depends的计算字段,创建记录时会自动根据quantity和price的值计算,不需要手动写入传值,冗余传值会被计算逻辑覆盖,可以直接去掉。

修改后的Inventory模块迁移方法代码

def action_delete(self):
    vals = {
        'ref_code': self.ref_code,
        'product_name': self.product_name,
        'product_description': self.product_description,
        'teslim_alan': self.teslim_alan,
        'teslim_eden': self.teslim_eden,
        'quantity': self.quantity,
        'price': self.price,
        # 兼容仓库为空的场景,空时传False
        'warehouse_id': self.warehouse_id.id if self.warehouse_id else False
    }
    self.env['scrap'].create(vals)
    return super(InventoryMenu, self).unlink()

修改后的Scrap模块迁回方法代码

def action_getback(self):
    vals = {
        'ref_code': self.ref_code,
        'product_name': self.product_name,
        'product_description': self.product_description,
        'teslim_alan': self.teslim_alan,
        'teslim_eden': self.teslim_eden,
        'quantity': self.quantity,
        'price': self.price,
        # 兼容仓库为空的场景,空时传False
        'warehouse_id': self.warehouse_id.id if self.warehouse_id else False
    }
    self.env['inventory.menu'].create(vals)
    return super(Scrap, self).unlink()

补充说明:Odoo中给Many2one字段传值支持两种合法格式:一是直接传关联记录的整数ID,二是传对应模型的单条记录集,直接传记录集的写法在新版本Odoo部分场景可能兼容,但旧版本或直接数据库写入场景下必须传整数ID/False,取id传值是兼容性最高的标准写法。

内容的提问来源于stack exchange,提问作者Enes Kara

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 09:54:23