Odoo 模型对象解析
Odoo 的 ORM 机制建立在模型对象之上,核心逻辑位于 odoo/models.py 文件中。理解这些模型的层级关系和属性差异,是进行高效开发的基础。主要可以分为四类:BaseModel、AbstractModel、Model 和 TransientModel。
BaseModel
BaseModel 是所有模型对象的根类,定义了最基础的行为。它本身通常不直接实例化为具体的业务模型,而是作为其他类的父类存在。
关键属性包括:
_auto = False:控制是否在后台自动创建数据表。_abstract = True:标记为抽象模型,不会生成物理表。_name = None:模型名称,默认值为 None。_description = None:模型描述。_table:对应的数据库表名,默认将_name 中的点替换为下划线。_sql_constraints:SQL 约束列表。_rec_name:在其他模型中引用此模型时显示的字段,默认为 name。_order:记录排序规则,默认为 'id'。
AbstractModel
AbstractModel 本质上等同于 BaseModel。它是一个抽象模型,不会在数据库中创建对应的表。在实际项目中,Model 可以继承 AbstractModel,利用它为多个 Model 提供相同属性的统一声明,实现代码复用。
Model
Model 是最常用的持久化模型类型,继承自 AbstractModel。与 AbstractModel 不同,Model 设置了 _auto=True 且 _abstract=False(虽然部分文档可能表述模糊,但实际行为如此)。这意味着当模块安装或升级时,Odoo 会自动在数据库中创建相应的数据表来存储业务数据。
TransientModel
TransientModel 继承自 Model,但它有一个特殊标志 _transient = True。这类模型对应的数据被视为临时数据,系统会定期清理其对应的表记录。因此,TransientModel 一般用于向导(Wizard)对象模型,处理一次性操作或临时配置。
开发建议
选择正确的模型类型能优化数据库结构并提升性能。持久数据用 Model,临时配置用 TransientModel,公共逻辑封装进 AbstractModel。避免滥用 AbstractModel 导致不必要的表结构混乱,也要确保 TransientModel 不会被误当作长期数据存储使用。

