大多数Odoo 模块的定义,如用户界面和权限规则,实际是存储在对应数据表中的数据记录。模块中的 XML 和 CSV 文件不是 Odoo 应用运行时使用,而是将这些定义加载到数据表的手段。
正是因为这个原因,Odoo 模块的一个重要部分是在文件中放入数据以便插件安装时将其加入数据库。
此外,掌握Odoo的数据展现的格式对于在项目实施时导入、导出业务数据也很重要。
本章的主要内容有:
- 理解外部标识符的概念
- 导入导出数据文件
- 使用 CSV 文件
- 添加模块数据
- 使用 XML 数据文件
学完本章,读者可以执行数据导入导出,将初始数据加入到数据库中,并可对所创建模块自动创建默认及演示数据。
开发准备
本章要求读者可以运行Odoo 服务并已安装前面我们此前开发的图书应用。
相关代码请见GitHub 仓库的ch05/目录。其中包含第三章 Odoo 15开发之创建第一个 Odoo 应用中的library_app,以及本章中所新增的代码。
理解外部标识符的概念
外部标识符,也称为XML ID,是用于唯一标识 Odoo 中特定记录的易于阅读的字符串标识符。在Odoo 中加载数据时它们就很重要了,这样可以对已有数据记录进行修改或在其它数据记录中引用它。
首先我们将讨论外部标识符的工作原理以及如何检查外部标识符。然后我们会学习如何使用网页客户端来查找指定数据记录的外部标识符,在创建插件模块或扩展已有功能时需要经常用到。
外部标识符的工作原理
我们先从标识部的原理开始。记录在数据库中的真实标识符是自动分配的序列号,在安装模块时无法预先知道将要分配的具体ID。外部标识符让我们无需知道真实分配的数据库 ID便可以引用一条相关记录。XML ID 为数据库 ID 提供了一个方便的别名,借此我们可以在任何时刻引用某一指定记录。
Odoo 模块数据文件中使用XML ID来定义记录。其中一个原因是避免在升级模块时创建重复的记录,在升级时会再次将数据文件加载到数据库中。我们要检测已有记录来进行更新,而不是重复创建记录。
使用XML ID的另一个原因是支持交叉数据:即需引用其它数据记录的数据记录。因为我们无法知道真实数据库 ID,使用XML ID来由 Odoo 框架处理透明的转换。
Odoo 处理由外部标识符对所分配的真实数据库 ID 的转换。背后的机制相当简单:Odoo 维护一张外部标识符和对应数据库数字 ID 的映射表:ir.model.data模型。
我们需启用开发者模式才能访问下文中的菜单。可通过在右上角头像左侧查看是否有调试图标,如果没有需在 Settings菜单页启用,具体方法可参照第一章 使用开发者模式快速入门 Odoo 15中的内容。
通过菜单访问Settings > Technical > Sequences & Identifiers > External Identifiers可查看已有映射。例如访问外部标识符列表并过滤出library_app模块,将可以看到该模块生成的外部标识符,如下图所示:
图5.1:由library_app生成的外部标识符
可以看到外部标识符有Complete ID标签。注意其组成部分为:模块名+.+标识符名,如library_app.action_library_book。
外部标识符仅需在 Odoo 模块内唯一,两个模块中使用相同标识符不会产生冲突。全局唯一标识符是由模块名和外部标识符共同组成的,在上图Complete ID字段中可以看到。
在数据文件中使用外部标识符时,我们可以选择完整的标识符或仅外部标识符部分。通常仅使用外部标识符会更简单,但使用完整标识符时我们可以引用其它模块中的数据记录。做引用时不要忘记在模块依赖中加入这些模块以确保在我们的记录之前加载这些记录。
有时即便引用相同模块中的XML ID也需使用完整标识符。
在上图列表最上方可以看到library_app.action_library_book完整标识符。这是我们在模块中创建的菜单动作,在相应的菜单项中引用。点击进入表单视图查看详情。图中可以看出library_app模块中的action_library_book外部标识符映射到ir.actions.act_window模型中的记录 ID,此处为90。
点击该记录行,可以看到如下图所示的表单视图:
图5.2:外部标识符的表单视图
除了用于由记录引用其它记录外,外部标识符还可以避免重复导入带来的重复数据。一旦外部标识符已存在,则会在原有记录上更新,避免了重复数据的新建。
查找外部标识符
在为我们的模块写入数据记录时,经常需要查找已有外部标识符来作引用。因此了解如何找到这些标识符就很重要了。
一种方式是访问菜单Settings > Technical > Sequences & Identifiers > External Identifiers,前面的图5.1已经演示过。另一种方法是使用开发者菜单。在第一章 使用开发者模式快速入门 Odoo 15介绍了如何在面板Settings右下角激开发者模式。
要查找一条数据记录的外部标识符,我们应打开对应的表单视图,选择Developer菜单,然后选择View Metadata选项。此时会显示一个带有记录数据库 ID 和外部标识符(也称作XML ID)的对话框。
比如要查看 demo 用户 ID,需通过 Settings > Users & Companies > Users 打开demo用户表单视图,然后点击开发者工具菜单中的View Metadata选项。此时可以看到XML ID是base.user_demo,数据库 ID 是6:
图5.3:View Metadata对话框窗口
查看表单、列表、搜索或 action 视图元素中的外部标识符,都可以使用开发者菜单。下面我们通过Edit View选项来打开相应视图的详情表单。此时可以查看到External ID字段,其值即为外部标识符。
例如在下图中,可以看到用户表单视图的外部标识符为base.view_users_form: