如何在Odoo中自动重装模块?Odoo 11修改模块无需重装的方法
嘿,针对你在Odoo 11里修改模块后每次都要重装的痛点,我给你整理了实用的解决方案——既有不用重装的替代方法,也有自动重装的技巧,都是开发时常用的操作:
无需重装模块的替代方法
其实大部分修改场景都不需要重装模块,以下是几种更高效的方式:
升级模块(Upgrade):这是Odoo官方推荐的更新方式,会保留现有业务数据,只同步代码变更和视图/模型的结构更新。
- 后台操作:激活开发者模式后,在「应用」列表找到目标模块,点击右上角的「升级」按钮即可。
- 命令行操作:执行
./odoo-bin -u 你的模块名 -d 数据库名,其中-u代表升级模块,-d指定要操作的数据库。
分类型刷新修改:根据你修改的内容类型,针对性操作,不用全量升级:
- Python代码逻辑修改:如果只是调整模型的方法逻辑,不需要新增/修改字段,只需重启Odoo服务即可生效,无需升级或重装。但如果涉及字段新增/修改(会改变数据库表结构),还是需要用「升级」操作。
- 视图/模板修改:开启开发者模式后,打开对应的视图编辑保存,或者在开发者菜单里点击「刷新视图」,甚至直接按
Ctrl+F5强制刷新浏览器缓存,就能看到最新的视图效果。 - 静态文件(CSS/JS)修改:在开发者模式的「设置」→「开发者工具」里点击「清除缓存并重新加载」,或者手动清除浏览器缓存,静态资源的修改就能即时生效,不用重启服务。
开发阶段热重载工具:可以用
odoo-autoreload工具监听文件变化,自动重启Odoo服务,省去手动重启的麻烦。- 安装:
pip install odoo-autoreload - 启动Odoo时添加参数:
./odoo-bin -d 数据库名 --autoreload,之后修改Python代码会自动触发服务重启。
- 安装:
如何自动重装模块
如果确实需要频繁重装(比如测试场景),可以通过以下方式实现自动化:
Shell脚本一键重装:写一个简单的脚本,适合Linux/macOS环境:
#!/bin/bash # 替换成你的模块名和数据库名 MODULE_NAME="your_module" DB_NAME="your_database" # 停止Odoo服务(如果是systemd管理的话) sudo systemctl stop odoo # 强制重装模块,--force会覆盖现有模块数据 ./odoo-bin -i $MODULE_NAME -d $DB_NAME --force # 重启Odoo服务 sudo systemctl start odoo保存为
reinstall_module.sh,赋予执行权限chmod +x reinstall_module.sh,之后运行./reinstall_module.sh就能自动完成重装。Odoo后台一键重装按钮:在开发者模式下创建一个自定义向导,实现一键重装:
- 创建一个临时模型(TransientModel),编写Python代码:
from odoo import api, models class ModuleReinstallWizard(models.TransientModel): _name = 'module.reinstall.wizard' def action_reinstall(self): # 替换成你的模块名 module = self.env['ir.module.module'].search([('name', '=', 'your_module')]) # 先卸载再安装 module.button_uninstall() module.button_install() # 刷新页面 return {'type': 'ir.actions.client', 'tag': 'reload'} - 给这个向导添加菜单和按钮,之后在后台就能点击按钮一键重装模块(注意:此操作会清除模块相关数据,仅适合测试环境)。
- 创建一个临时模型(TransientModel),编写Python代码:
Odoo Shell批量执行:通过Odoo Shell直接执行重装逻辑,适合快速测试:
./odoo-bin shell -d 你的数据库名 << EOF module = env['ir.module.module'].search([('name', '=', '你的模块名')]) module.button_uninstall() module.button_install() exit() EOF
注意事项
- 生产环境尽量避免重装模块,优先使用「升级」操作,防止数据丢失。
- 任何修改前都建议备份数据库,尤其是涉及模块重装或字段变更的操作。
- 模型字段的新增/修改必须通过「升级」或「重装」来同步数据库结构,仅重启服务无效。
内容的提问来源于stack exchange,提问作者shubham sasgohar




