You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Odoo使用oldname重命名字段后数据未迁移的问题及解决方法

Odoo字段重命名后数据未迁移?oldname参数失效的原因与解决方法

我在日常开发Odoo模块时也碰到过好几次这个问题,咱们一步步来排查和解决:

一、为什么oldname参数没生效?

最常见的几个原因:

  • 没触发模块升级流程:Odoo的oldname字段重命名逻辑是仅在模块升级时执行的,如果你只是修改了代码、用热重载(比如--dev=reload)刷新,ORM根本不会执行数据迁移操作。
  • 字段定义冲突:如果代码里同时保留了wrong_fieldright_field的定义,Odoo会把它们当成两个独立字段,不会触发重命名迁移。
  • 热重载的局限性:开发模式下的热重载只适用于视图、逻辑代码的小修改,涉及数据库结构变更(比如字段重命名)必须用正式的模块升级。

二、解决步骤

1. 确保字段定义正确

先检查代码,确保只保留新字段的定义,并且oldname指向旧字段名:

# 错误:同时保留旧字段和新字段
# wrong_field = fields.Char('Wrong')
right_field = fields.Char('Right', oldname='wrong_field')

2. 执行模块升级

通过Odoo后台或者命令行完成模块升级:

  • 后台操作:进入「应用」模块,找到你的模块,点击「升级」按钮(如果看不到升级按钮,先开启「开发者模式」)。
  • 命令行操作:启动Odoo时加上参数:
    ./odoo-bin -c your_config.conf -u your_module_name
    

3. 升级后仍无数据?试试手动迁移脚本

如果以上操作后数据还是没过来,大概率是ORM没检测到字段重命名(比如模块版本号没更新),这时候可以写一个手动迁移脚本:

  1. 在模块根目录下创建migrations/1.1文件夹(假设原版本是1.0,现在升级到1.1)。
  2. 在该文件夹下创建post-migrate.py文件,内容如下:
    def migrate(cr, version):
        if not version:
            return
        # 替换成你的模型对应的数据库表名(通常是模块名_模型名,比如my_module_my_model)
        cr.execute("UPDATE your_model_table SET right_field = wrong_field WHERE right_field IS NULL")
        # 可选:删除旧字段(Odoo后续升级可能自动删,手动删更彻底)
        cr.execute("ALTER TABLE your_model_table DROP COLUMN IF EXISTS wrong_field")
    
  3. 修改模块的__manifest__.py,把'version': '1.0'改成'version': '1.1'
  4. 再次执行模块升级,Odoo会自动运行这个迁移脚本,把旧字段的数据同步到新字段。

4. 排查数据库表结构

如果还是有问题,可以直接登录数据库查看表结构:

  • 检查模型表中是否存在right_field字段。
  • 查看wrong_field的数据是否还存在,手动执行SQL语句验证迁移逻辑:
    SELECT wrong_field, right_field FROM your_model_table LIMIT 10;
    

内容的提问来源于stack exchange,提问作者Yuhui Wang

火山引擎 最新活动