如何解决Odoo中的ValueError:系统中未找到外部ID问题?
嘿,我看你碰到了Odoo模块加载时的外部ID匹配错误,这在自定义模块开发里挺常见的,咱们一步步来搞定它!
先看看你遇到的核心错误提示:
Exception: Module loading hospital_management failed: file hospital_management\security/ir.model.access.csv could not be processed:
No matching record found for external id 'model_hospital_patient' in field 'Model'
Missing required value for the field 'Model' (model_id)
这个错误的本质是:你的权限配置文件里引用的model_hospital_patient外部ID,系统找不到对应的模型记录。问题出在你手动创建了ir.model记录,但Odoo其实会自动帮你生成这个记录!
问题根源
你在hospital_patient_views.xml里手动写了一段ir.model的记录:
<record id="model_hospital_patient" model="ir.model"> <field name="name">hospital.patient</field> <field name="model">hospital.patient</field> <field name="state">manual</field> </record>
但Odoo的运行机制是:当你在Python文件里定义了_name = 'hospital.patient'的模型后,系统会自动在数据库中创建对应的ir.model记录,并且自动生成外部IDmodel_hospital_patient。你手动创建这个记录不仅多余,还会因为加载顺序问题,导致权限文件加载时,要么手动的记录还没创建,要么和自动生成的记录冲突,从而找不到对应ID。
解决方案
只需要做一件事:把XML中手动创建的ir.model记录删掉。
之后按以下步骤操作:
- 保存修改后的XML文件
- 重启Odoo服务(可选,但能避免缓存残留问题)
- 升级你的
hospital_management模块
这样Odoo会先加载你的Python模型hospital.patient,自动生成对应的ir.model记录和外部IDmodel_hospital_patient,之后加载权限文件时就能正确匹配到这个ID了。
额外验证
再确认下你的权限文件security/ir.model.access.csv配置是正确的:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_hospital_patient,hospital_patient,model_hospital_patient,,1,1,1,1
这里的model_id:id列使用model_hospital_patient是完全正确的,只要模型被正常加载,这个外部ID就会存在。
试试这个方法,应该就能解决你遇到的模块加载错误了!
备注:内容来源于stack exchange,提问作者Suraj Chadha

