Odoo模块开发教程6-导入导出 CSV 数据文件第三讲
添加模块数据
模块使用数据文件来加载默认数据、演示数据、用户界面定义和其它需存入数据库的配置。可以选择使用 CSV 或 XML 文件。
“ 注意: Odoo 12 的修改Odoo 11 及之前版本支持 YAML 格式文件,但在 Odoo 12 移除了相关支持。相关使用示例可参考 Odoo 11 官方模块 l10n_be,更多 YAML 格式相关信息,可访问 http://yaml.org/。 ”
模块所使用的 CSV 和我们前述使用导入功能时用的文件是一样的。在模块中使用这些文件时,文件名须与要导入数据的模型名一致。例如,导入 library.book 模型的 CSV 数据文件名应为
library.book.csv。 CSV 数据文件经常用作导入 ir.model.access 模型来获取权限定义,通常放在security/子目录下并命名为 ir.model.access.csv。
演示数据
Odoo 插件模块可安装演示数据,推荐支持该安装。为模块提示使用示例和测试用的数据集会非常有用。模块的演示数据通过__manifest__.py 文件中的 demo 属性来声明。和 data 属性一
样,后接一个包含模块相对路径的文件名列表。我们应为 library.book 模块添加一些演示数据,一个简易方式是从安装了模块的开发数据库中导出数据。按惯例数据文件放在 data/子目录下,应以 data/library.book.csv 保存在 library_app 模块下。因这个数据为模块所有,应在导出的数据中将标识符的前缀__export__去除。
例如 res.partner.csv 文件可能长这样:
id,name
res_partner_alexandre,"Alexandre Fayolle"
res_partner_daniel,"Daniel Reis"
res_partner_holger,"Holger Brunn"
res_partner_packt,"Packt Publishing"
那么图书演示数据文件 library.book.csv 就应该是这样的:
"id","name","date_published","publisher_id/id","author_ids/id"
library_book_ode11,"Odoo Development Essentials 11","2018-03-
01",res_partner_packt,res_partner_daniel
library_book_odc11,"Odoo 11 Development Cookbook","2018-01-
01",res_partner_packt,"res_partner_alexandre,res_partner
_holger"
注意文件中同一条数据因显示原因可能在不同行中,但实际是不能换行的。还应记得在
__manifest__.py 的 demo 属性中声明数据文件:
'demo': [
'data/res.partner.csv',
'data/library.book.csv',
],
文件会以声明的顺序来加载,这个很重要,因为文件可能会因为未被安装而无法引用其记录。只要启用了安装演示数据,下次更新时,这些内容就会被导入。
“ 小贴士: 数据文件会在模块升级时重新导入,但演示文件则并非如此,它们仅在安装时导入。 ”
当然 XML 文件也可用于加载或初始化数据,还可使用普通 CSV 文件所不具备的功能。
使用 XML 数据文件
CSV 文件是一种展示数据方便简洁的格式,但 XML 文件更为强大,可在加载过程中提供更多的控制。比如,其文件名无需与所导入到的模型名称一致。因为 XML 格式通过文件内的 XML 元
素可以提供更丰富的信息、更多的内容。在前面的文章中我们已经使用过 XML 数据文件。视图和菜单项这类用户界面组件实际上都是存储在系统模型中的记录。模块中的 XML 文件是将这些记录加载到实例数据库的方式。我们将在library_app 模块中添加一个数据文件 data/book_demo.xml 来作为展示,文件内容如下:
<odoo noupdate="1">
<!-- Data to load -->
<record model="res.partner" id="res_partner_huxley">
<field name="name">Aldous Huxley</field>
</record>
<record model="library.book" id="library_book_bnw">
<field name="name">Brave New World</field>
<field name="author_ids"
eval="[(4, ref('res_partner_huxley'))]" />
<field name="date_published">1932-01-01</field>
</record>
</odoo>
老规矩,新的数据文件应在__manifest__.py 中声明:
'demo': [
...
'data/book_demo.xml',
],
类似 CSV 文件,该文件也会将数据加载到图书模型中。
XML 文件包含一个外层元素,内部可包含多个元素与对应 CSV 数据行。
“ 小贴士: 数据文件中的外层元素在 9.0 中才引入用于替换此前的标签。现在仍支持外层元素内的标签,为可选项。事实上现在和是等价的,我们可以在数据文件中使用任意一个作为外层元素。 ”
元素有两个强制属性: model 和作为记录外部标识符的 id,每个字段使用一个标签来进行写入。注意此处字段名内不可使用斜杠标记,如不可使用。应使用 ref 属性来引用外部标识符,一会儿就会讨论到关联 to-many 字段。
你可能注意到在外层元素中使用了 noupdate=” 1″属性。这防止了在模块升级时数据记录的载入,不至于在后续编辑中丢失数据。