Odoo测试中如何注册自定义ORM模型并成功创建记录
问题原因
Odoo模型注册表只会在服务启动、模块加载阶段自动扫描、注册所有继承自Model的子类。测试执行时已经走完了全量模型加载流程,测试方法内部定义的TestModel不会被自动识别加入注册表,直接通过环境访问就会抛出KeyError: 'test.model'。
解决方案
通过注册表提供的手动注册API,在测试代码内完成模型注册、结构初始化、建表操作即可,修改后的可运行测试代码如下:
from odoo.tests.common import TransactionCase from odoo.fields import Char from odoo.models import Model class CreateModelInstanceTest(TransactionCase): def test_create_model_instance(self): # 定义测试模型 class TestModel(Model): _name = "test.model" _description = "Test model for unit test" name = Char() # 获取当前数据库对应的模型注册表 model_registry = self.env.registry # 1. 将模型类添加到注册表映射 model_registry.add(TestModel._name, TestModel) # 2. 构建模型元数据、字段属性、依赖关系 TestModel._build_model(model_registry, self.env.cr) # 3. 完成全量已注册模型的配置加载 model_registry.setup_models(self.env.cr) # 4. 初始化模型对应的数据库表、字段、约束 model_registry.init_models(self.env.cr, [TestModel._name], {}) # 注册完成后即可正常操作模型 test_record = self.env["test.model"].create({"name": "Test"}) self.assertEqual(test_record.name, "Test")
注意事项
- 动态注册的测试模型仅在当前测试用例的事务上下文内生效,
TransactionCase会在测试结束后自动回滚数据库游标,不会污染其他测试用例或正式环境的模型结构。 - Odoo 14及以上版本要求所有模型必须声明
_description属性,否则会抛出警告或运行时错误。 - 如果测试模型包含关联字段(
Many2one/One2many/Many2many),需要确保被关联的目标模型已经在注册表中存在,再执行init_models操作。 - Odoo 16+版本中
init_models方法的第三个参数传空字典即可正常运行,不需要额外传入自定义字段更新标记。
内容的提问来源于stack exchange,提问作者Lee Vannes
相关产品推荐
相关产品推荐

