Odoo 13模块安装时security.xml相关KeyError原因排查
以下是几种可能导致该报错的原因,按排查优先级排序:
security.xml未被纳入模块加载清单
再仔细核对__manifest__.py里的data列表,确认是否包含了security.xml的正确路径(比如'security/security.xml',如果文件放在security子目录下)。哪怕路径多了个空格、少了个斜杠,都会导致Odoo跳过该文件,自然读不到里面的external ID。数据库残留数据或缓存干扰
之前安装过该模块的话,数据库里可能残留了旧的模块记录或缓存,导致Odoo没有重新解析新的security.xml。可以先完全卸载模块(在Odoo后台删除模块后,手动清理数据库中ir_model_data表中该模块的相关记录),然后重启Odoo服务并加上--clear-cache参数清理缓存,再重新安装模块。文件权限不足
Ubuntu虚拟机里,Odoo运行用户(通常是odoo用户)可能没有读取security.xml的权限。检查文件权限:ls -l /path/to/your/module/security/security.xml确保文件所有者是
odoo或所属组包含odoo,权限至少设置为644,目录权限设置为755,否则Odoo无法读取文件内容。external ID拼写或命名空间冲突
再次检查security.xml里的ID定义,确认<record>标签的id属性值完全是inventory_keeper_manager_role,注意大小写(Odoo的external ID区分大小写)。另外,排查是否有其他模块也定义了同名的external ID,导致Odoo优先加载了其他模块的记录,而非当前模块的。依赖模块未正确加载
虽然你说清单顺序正确,但如果这个角色依赖其他模块的权限组或模型,而依赖模块未完全安装或加载,也会导致ID无法被识别。核对__manifest__.py的depends列表,确保所有依赖模块都已正确安装,且安装顺序在当前模块之前。security.xml语法或兼容性问题
检查security.xml里的res.groups定义是否符合Odoo 13的规范,比如是否使用了Odoo 13不支持的字段或属性。哪怕是一个未闭合的标签、错误的属性名,都会导致整个文件解析失败,ID无法被注册。
内容的提问来源于stack exchange,提问作者Evan

