You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:45:40