Odoo 18激活应用时出现Model not found错误排查求助
问题背景
开发meeting_management自定义模块时,模块安装完成后激活触发「Model not found: meeting.management」错误。模块结构包含controllers、models(内有MeetingManagement.py文件)、views(内有meeting_creation.xml视图文件)和static目录。模型代码定义了_name为meeting.management的MeetingManagement类,但视图尝试访问该模型时失败。
相关代码
模型代码(models/meeting.py)
from odoo import models, fields class MeetingManagement(models.Model): _name = 'meeting.management' _description = 'Meeting Management' space_id = fields.Char(string='Matterport Link', required=True) devices = fields.Many2many('meeting.device', string='Devices') microphone = fields.Boolean(string='Microphone') speaker = fields.Boolean(string='Speaker') audio = fields.Selection([('stereo', 'Stereo'), ('mono', 'Mono')], string='Audio') participant_name = fields.Char(string='Participant Name') def create_meeting(self): # Implement logic to create meeting # Generate meeting ID and return it return 'Generated Meeting ID' def join_meeting(self): # Implement logic to join meeting # Redirect or process further actions pass
视图代码(views/meeting_creation.xml)
<!-- views/meeting_creation.xml --> <odoo> <record id="meeting_creation_form" model="ir.ui.view"> <field name="name">meeting.creation.form</field> <field name="model">meeting.management</field> <field name="arch" type="xml"> <form string="Create Meeting"> <group> <field name="space_id" placeholder="Enter Matterport Link"/> </group> <footer> <button name="create_meeting" string="Create Meeting" type="object" class="btn-primary"/> </footer> </form> </field> </record> </odoo>
错误信息
RPC_ERROR Odoo Server Error Occured on localhost:8069 on model ir.module.module and id 9 on 2024-10-09 08:55:28 GMT Traceback (most recent call last): File "C:\coding\odoo development\17\odoo\odoo\http.py", line 1954, in _transactioning return service_model.retrying(func, env=self.env) File "C:\coding\odoo development\17\odoo\odoo\service\model.py", line 137, in retrying result = func() File "C:\coding\odoo development\17\odoo\odoo\http.py", line 1921, in _serve_ir_http response = self.dispatcher.dispatch(rule.endpoint, args) File "C:\coding\odoo development\17\odoo\odoo\http.py", line 2168, in dispatch result = self.request.registry['ir.http']._dispatch(endpoint) File "C:\coding\odoo development\17\odoo\odoo\addons\base\models\ir_http.py", line 330, in _dispatch result = endpoint(**request.params) File "C:\coding\odoo development\17\odoo\odoo\http.py", line 728, in route_wrapper result = endpoint(self, *args, **params_ok) File "C:\coding\odoo development\17\odoo\addons\web\controllers\dataset.py", line 40, in call_button action = call_kw(request.env[model], method, args, kwargs) File "C:\coding\odoo development\17\odoo\odoo\api.py", line 517, in call_kw result = getattr(recs, name)(*args, **kwargs) File "<decorator-gen-79>", line 2, in button_immediate_install File "C:\coding\odoo development\17\odoo\odoo\addons\base\models\ir_module.py", line 75, in check_and_log return method(self, *args, **kwargs) File "C:\coding\odoo development\17\odoo\odoo\addons\base\models\ir_module.py", line 477, in button_immediate_install return self._button_immediate_function(self.env.registry[self._name].button_install) File "C:\coding\odoo development\17\odoo\odoo\addons\base\models\ir_module.py", line 601, in _button_immediate_function registry = modules.registry.Registry.new(self._cr.dbname, update_module=True) File "<decorator-gen-13>", line 2, in new File "C:\coding\odoo development\17\odoo\odoo\tools\func.py", line 97, in locked return func(inst, *args, **kwargs) File "C:\coding\odoo development\17\odoo\odoo\modules\registry.py", line 131, in new odoo.modules.load_modules(registry, force_demo, status, update_module) File "C:\coding\odoo development\17\odoo\odoo\modules\loading.py", line 479, in load_modules processed_modules += load_marked_modules(env, graph, File "C:\coding\odoo development\17\odoo\odoo\modules\loading.py", line 363, in load_marked_modules loaded, processed = load_module_graph( File "C:\coding\odoo development\17\odoo\odoo\modules\loading.py", line 226, in load_module_graph load_data(env, idref, mode, kind='data', package=package) File "C:\coding\odoo development\17\odoo\odoo\modules\loading.py", line 70, in load_data tools.convert_file(env, package.name, filename, idref, mode, noupdate, kind) File "C:\coding\odoo development\17\odoo\odoo\tools\convert.py", line 608, in convert_file convert_xml_import(env, module, fp, idref, mode, noupdate) File "C:\coding\odoo development\17\odoo\odoo\tools\convert.py", line 679, in convert_xml_import obj.parse(doc.getroot()) File "C:\coding\odoo development\17\odoo\odoo\tools\convert.py", line 594, in parse self._tag_root(de) File "C:\coding\odoo development\17\odoo\odoo\tools\convert.py", line 548, in _tag_root raise ParseError(msg) from None # Restart with "--log-handler odoo.tools.convert:DEBUG" for complete traceback odoo.tools.convert.ParseError: while parsing file:/c:/coding/odoo%20development/17/custom_modules/meeting_management/views/meeting_creation.xml:3 Error while validating view near: <form string="Create Meeting" __validate__="1"> <group> <field name="space_id" placeholder="Enter Matterport Link"/> Model not found: meeting.management View error context: {'file': 'c:\\coding\\odoo ' 'development\\17\\custom_modules\\meeting_management\\views\\meeting_creation.xml', 'line': 1, 'name': 'meeting.creation.form', 'view': ir.ui.view(266,), 'view.model': 'meeting.management', 'view.parent': ir.ui.view(), 'xmlid': 'meeting_creation_form'} The above server error caused the following client error: RPC_ERROR: Odoo Server Error RPCError@http://localhost:8069/web/assets/b23fe77/web.assets_web.min.js:3053:338 makeErrorFromResponse@http://localhost:8069/web/assets/b23fe77/web.assets_web.min.js:3056:163 rpc._rpc/promise</<@http://localhost:8069/web/assets/b23fe77/web.assets_web.min.js:3061:34
问题排查与解决步骤
1. 模型文件命名与路径一致性检查
你提到模型实际文件是models/MeetingManagement.py,但代码示例中写的是models/meeting.py,这是最可能的原因。Odoo会自动扫描models目录下的.py文件,但文件名必须与导入路径匹配。
- 修复方案:
- 要么将模型文件重命名为
meeting.py,保持与代码引用路径一致; - 要么在
models/__init__.py中显式导入MeetingManagement类。
- 要么将模型文件重命名为
2. 完善模块导入配置
检查模块的__init__.py文件是否正确配置:
- 模块根目录的
__init__.py需包含:from . import models models目录下的__init__.py需包含:# 如果文件是meeting.py from . import meeting # 如果文件是MeetingManagement.py from . import MeetingManagement
Odoo依赖这些导入语句来识别并加载模型类,缺少的话会导致模型无法注册。
3. 确认视图加载顺序
检查模块的__manifest__.py文件,确保data列表中视图文件的加载顺序不会早于模型的注册。典型的__manifest__.py配置:
{ 'name': 'Meeting Management', 'version': '1.0', 'depends': ['base'], 'data': [ 'views/meeting_creation.xml', ], 'installable': True, 'auto_install': False, }
注:只要模型通过__init__.py正确导入,无需在data中配置模型文件,Odoo会自动处理加载顺序。
4. 模型类定义验证
确认模型类正确继承models.Model,且_name属性拼写无误。你的代码中_name = 'meeting.management'格式正确,需确保没有大小写或符号错误(Odoo模型名要求全小写,用点号分隔)。
5. 清理服务器缓存并重新安装
Odoo服务器可能缓存旧的模块信息,导致模型未被正确加载:
- 重启Odoo服务器;
- 卸载已安装的
meeting_management模块; - 重新安装并激活模块。
验证步骤
完成上述调整后,按以下流程验证:
- 重启Odoo服务;
- 进入模块列表,找到
meeting_management模块,点击卸载; - 重新安装模块并激活,检查错误是否消失。
内容的提问来源于stack exchange,提问作者moneniko

