在Odoo中扩展Pydantic V2模型时遇到的扩展失效问题
解决Odoo 16中extendable-pydantic扩展Pydantic模型失效问题
问题核心
在Odoo模块加载机制下,附加模块定义的ExtendedMainModel未被正确注册到extendable-pydantic的扩展系统,导致主模型MainModel无法合并扩展字段。
解决方案步骤
- 主模块模型继承
ExtendableModel基类 - 附加模块中定义扩展模型并设置
extend=True标记 - 利用Odoo模块加载钩子触发扩展注册动作
主模块(main_module)代码实现
# main_module/models.py from extendable_pydantic import ExtendableModel from pydantic import Field class MainModel(ExtendableModel): field_a: str = Field(description="基础字段A") field_b: int = Field(description="基础字段B") class Config: orm_mode = True
附加模块(module_a)代码实现
# module_a/models.py from extendable_pydantic import ExtendableModelMeta from main_module.models import MainModel class ExtendedMainModel(MainModel, extend=True): field_c: float = Field(description="扩展字段C") def register_extensions(): """注册扩展模型,需在模块安装后执行""" ExtendableModelMeta.register_extended_model(MainModel, ExtendedMainModel)
修改附加模块的__manifest__.py,添加模块初始化钩子:
{ 'name': '附加模块A', 'depends': ['main_module'], 'post_init_hook': 'module_a.models.register_extensions', # 其他Odoo清单配置项 }
关键说明
- 扩展模型必须通过
extend=True声明,告知extendable-pydantic这是一个扩展类 - 必须显式调用
ExtendableModelMeta.register_extended_model完成注册,Odoo的模块加载机制不会自动触发该动作 - 使用
post_init_hook确保在模块安装完成后执行注册,此时主模型已被正确加载
验证示例
# 仅激活主模块时 obj = MainModel(field_a="demo", field_b=2024) print(obj.dict()) # 输出: {'field_a': 'demo', 'field_b': 2024} # 安装附加模块A后 obj = MainModel(field_a="demo", field_b=2024, field_c=3.14) print(obj.dict()) # 输出: {'field_a': 'demo', 'field_b': 2024, 'field_c': 3.14}
内容的提问来源于stack exchange,提问作者Corwin
相关产品推荐
相关产品推荐

