Odoo使用oldname重命名字段后数据未迁移的问题及解决方法
Odoo字段重命名后数据未迁移?oldname参数失效的原因与解决方法
我在日常开发Odoo模块时也碰到过好几次这个问题,咱们一步步来排查和解决:
一、为什么oldname参数没生效?
最常见的几个原因:
- 没触发模块升级流程:Odoo的
oldname字段重命名逻辑是仅在模块升级时执行的,如果你只是修改了代码、用热重载(比如--dev=reload)刷新,ORM根本不会执行数据迁移操作。 - 字段定义冲突:如果代码里同时保留了
wrong_field和right_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没检测到字段重命名(比如模块版本号没更新),这时候可以写一个手动迁移脚本:
- 在模块根目录下创建
migrations/1.1文件夹(假设原版本是1.0,现在升级到1.1)。 - 在该文件夹下创建
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") - 修改模块的
__manifest__.py,把'version': '1.0'改成'version': '1.1'。 - 再次执行模块升级,Odoo会自动运行这个迁移脚本,把旧字段的数据同步到新字段。
4. 排查数据库表结构
如果还是有问题,可以直接登录数据库查看表结构:
- 检查模型表中是否存在
right_field字段。 - 查看
wrong_field的数据是否还存在,手动执行SQL语句验证迁移逻辑:SELECT wrong_field, right_field FROM your_model_table LIMIT 10;
内容的提问来源于stack exchange,提问作者Yuhui Wang




