模型和 Python 类
Odoo 模型以 Python 类的形式展现,在前面的代码中,有一个继承了 models.Model 类的Python 类: Book,创建了新 Odoo 模型: library.book。 Odoo 的模型保存在中央注册表
(central registry)中,可通过 env 环境对象(老 API 中称为 pool)获取。 它是一个数据库保存所有可用模型类引用的字典,其中的词条可通过模型名引用 。具体来说,模型方法中的代码可使用self.env[‘library.book’ ]来获取表示 library.book 模型的模型类。
可以看出模型名非常重要,因为它是访问该注册表的关键。模型名的规则是以点号连接的小写单词,如 library.book 或 library.book.category。内核模块中的其它示例有 project.project,project.task 和 project.task.type。模型名应使用单数,如 library.book 而非 library.books。
“ 小贴士: 由于历史原因,有些内核模型没有遵循这一规则,如 res.users。 ”模型名必须全局唯一,因此第一个单词应使用模块关联的主应用对应,以图书应用而言,模型名前缀使用 library。其它示例如内核模块的 project, crm 和 sale。另一方面 Python 类仅为所声明文件本地内容,名称仅需在代码文件中唯一即可。因为类名不会与其它模块中的类产生冲突,也
就不需为其添加主应用相关的前缀。
类的命名规范是使用驼峰命名法(CamelCase),这与 Python 标准的 PEP8 编码规范一致。
临时(Transient)模型和抽象模型
在前述代码中以及在大多数据 Odoo 模型中的类会继承 models.Model 类。这类模型在数据库中持久化存储:会为模型创建数据表并存储记录直至删除。但 Odoo 中还有另外两种模型类型:
临时模型和抽象模型。
临时模型继承 models.TransientModel 类,用于向导式的用户交互。这类数据会存储在数据库中,但仅是临时性的。会定时运行清空 job 来清除这些表中的老数据。比如 Settings >
Translations 菜单下的 Load a Language 对话窗口,就使用了临时模型来存储用户选择并实现向导逻辑。在第八章业务逻辑中会有讨论临时模型的示例。
抽象模型继承 models.AbstractModel 类,它不带有数据存储。抽象模型用作可复用的功能集,与使用 Odoo 继承功能的其它模型配合使用。例如 mail.thread 是 Discuss 应用中的一个抽象模型,用于为其它模型添加消息和 follower 功能。
检查已有模型
通过 Python 类创建的模型和字段在用户界面中有自己的元标签。启动开发者模式,访问菜单
Settings > Technical > Database Structure > Models,这里有数据库中的所有模型。点击列表中的模型会打开详情表单,
这是一个检查模型结构很好的工具,因为在这里可以看到不同模块所有自定义结果。上图中在右上角 In Apps 字段中可以看到 library.book 模型的定义来自 library_app 和 library_member 两
个模块。下方区域中还有几个包含附加信息的标签:
⚫ Fields 可快速查看模型字段
⚫ Access Rights 是授予不同权限组的访问控制规则
⚫ Views 显示模型所带的视图列表
我们可以通过开发者菜单下的 View Metadata 选项查看模型的外部标识符。模型的外部标识符或 XML ID 由 ORM 自动生成,但根据规则可预知,如 library.book 模型的外部标识符为
model_library_book。在定义安全访问控制列表经常在 CSV 文件中使用到这些 XML ID。
“ 小贴士: 如第一章 使用开发者模式快速入门 Odoo 12 中所见,模型表单是可编辑的。通过这里是可以创建并修改模型、字段和视图的。可在此处创建原型然后在插件模块中实现。 ”