Odoo 14升级至16后web.frontend_layout重复视图处理问题
解决Odoo 16中web.frontend_layout重复视图无法删除的问题
你遇到的核心问题是陈旧视图被其他继承视图依赖,直接删除触发外键约束,归档又导致站点崩溃。以下是可行的解决步骤:
1. 先修复依赖的继承视图
因为报错提示ir_ui_view_inherit_id_fkey约束,说明有其他视图继承了这个无外部ID的陈旧视图。你需要先把这些继承关系转移到正确的视图上:
- 开启开发者模式,进入设置 > 技术 > 用户界面 > 视图
- 搜索
inherit_id字段等于陈旧视图的ID(可从视图列表的URL或表单页获取ID,比如截图里的陈旧视图ID) - 把所有搜索到的继承视图的
inherit_id改成带外部IDweb.frontend_layout的正确视图ID
2. 通过Odoo Shell删除陈旧视图
如果后台操作不方便,用Odoo Shell更高效:
- 启动Shell(替换成你的数据库名):
./odoo-bin shell -d your_database_name - 执行以下代码(根据实际情况调整视图名称或搜索条件):
# 获取正确的视图 correct_view = env['ir.ui.view'].search([('external_id', '=', 'web.frontend_layout')]) # 获取陈旧视图(如果名称不对,换成你看到的陈旧视图名称) stale_view = env['ir.ui.view'].search([('name', '=', 'frontend layout'), ('external_id', '=', False)]) # 转移所有继承关系 env['ir.ui.view'].search([('inherit_id', '=', stale_view.id)]).write({'inherit_id': correct_view.id}) # 删除陈旧视图 stale_view.unlink() - 退出Shell后重启Odoo服务
3. 直接数据库操作(需备份)
如果以上方法都不行,直接操作PostgreSQL数据库(务必先备份数据库):
- 登录数据库:
psql -d your_database_name - 查询陈旧视图ID:
SELECT id FROM ir_ui_view WHERE name = 'frontend layout' AND external_id IS NULL; - 查询依赖它的继承视图:
SELECT id, name FROM ir_ui_view WHERE inherit_id = '陈旧视图ID'; - 转移继承关系(替换成正确视图的ID):
UPDATE ir_ui_view SET inherit_id = '正确视图ID' WHERE inherit_id = '陈旧视图ID'; - 删除陈旧视图:
DELETE FROM ir_ui_view WHERE id = '陈旧视图ID'; - 退出psql后重启Odoo服务
注意事项
- 操作前一定要备份数据库,避免数据丢失
- 修改完成后必须重启Odoo,清除系统缓存
- 若不确定视图ID,可在开发者模式下打开视图表单,从URL中提取(比如
#id=123&model=ir.ui.view中的123就是ID)
内容的提问来源于stack exchange,提问作者Anthony Taylor
相关产品推荐
相关产品推荐

