odoo之数据导入导出以及模块数据
odoo之数据导入导出以及模块数据
一.导入导出CSV数据文件
导出数据
### 步骤
# 1. 将要导出的数据勾选
# 2. 此时会出现action动作,选择export导出数据
# 3. 选择导出数据的方式,如下
What do you want do do?(老版本中为Export type),选择Import-Compatible Export选项,这样导出数据在以后导入时格式更友好。
Export formats:可选择CSV或Excel,我们将选择 CSV 格式来更好理解原始导出格式,在很多表单应用中都能被读取。
# 4.选择到出数据列字段,如External ID 和 NAME
1. id:为每条记录分配的外部 ID,如果不存在,会在模块名处使用__export__ 作为前缀自动生成一条新ID。
2. name: 联系人/Partner 名称
导入数据
# 步骤
# 1. Settings > General Settings
# 2. 在 Users 版块下勾选Import & Export选项即可
# 3. 列表视图上方 Create 按钮旁就会显示一个 Import按钮。
# 4. Test Import按钮 检查数据的正确性
CSV 数据文件中的关联记录
有一个出版商(publisher_id字段)的many-to-one(或外键)关联,以及一个作者(author_ids字段)的many-to-many关联。
CSV 文件的表头行中关联列应在名称后添加一个/id。它将使用外部标识符来引用关联记录。本例中,我们将在publisher_id/id字段中加载图书出版商,使用关联 Partner 的外部 ID 作为其值。
CSV 数据文件中也可导入many-to-many字段,这和添加带双引号并由逗号分隔的外部 ID 列表一样简单
id, name, author_ids/id
book_docker, "Mastering Docker - Third Edition","__export__.res_partner_44_767f4606,__export__.res_partner_43_b97c9264"
二.添加模块数据
演示数据
为模块提示使用示例和测试用的数据集会非常有用。模块的演示数据通过__manifest__.py
文件中的 demo 属性来声明。
# 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"
注意:创建数据库的时候勾选demodata
三.使用 XML 数据文件
XML 文件更为强大,可在加载过程中提供更多的控制
视图和菜单项这类用户界面组件实际上都是存储在系统模型中的记录。模块中的XML文件是将这些记录加载到实例数据库的方式。
book_demo.xml
数据文件
<?xml version="1.0"?>
<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',
],
注意:
1. <odoo>和<data>是等价的
2. 外层元素中使用了noupdate=”1″属性。这防止了在模块升级时数据记录的载入,不至于在后续编辑中丢失数据。
noupdate 数据属性
# 注意
noupdate属性在开发模块时可能会引起不适,因为会忽略后续修改。一个解决方案是,使用-i 参数重新安装模块而不是使用-u 参数进行更新。命令行中使用-i 参数重新安装会忽略数据记录中的noupdate标记
四.在 XML 中定义记录
在 XML 文件中,每个<record>元素有两个基本属性:id 和 model,并包含为对应列设置的值。 id 属性对应记录外部标识符,model 对应目标模型。<field>元素有几种分配值的方法,
直接为字段设置值
<field>元素的 name 属性标识要写入的字段。写入的值是元素内容:字段开、闭标签之间的文本。
通过表达式设置值
设置字段值更复杂的方式是通过 eval 属性,运行 Python 表达式并将结果分配给字段。表达式通过 Python 内置的以及一些其它可创建表达式标识符的上下文求值。
<field name="date_published"
eval="(datetime.now() + timedelta(-1))" />
求值上下文还可使用ref()函数,用于将外部标识符转换为对应的数据库 ID。这可用于为关联字段设置值。比如,可以使用它为publisher_id设置值:
<field name="publisher_id" eval="ref('res_partner_packt')" />
在 many-to-one 关联字段上设置值
像前文那样使用带有 ref()函数的 eval 属性。更简单的替代方式是使用在元素中可用的ref 属性,使用它设置publisher_id many-to-one字段的值
<field name="publisher_id" ref="res_partner_packt" />
在 to-many 关联字段上设置值
对于one-to-many和many-to-many字段,设置的不是单个 ID,而是一组关联 ID。 可能需要将当前的关联记录列表替换成另外一个,或为其添加几次记录,甚至是删除其中的一些记录
让to-many字段支持写操作 , 需要使用 eval 属性中使用一种特殊的语法
<field
name = "author_ids"
eval = "[(6, 0,
[ref('res_partner_alexandre'),
ref('res_partner_holger')]
)]"
/>
### 添加(4)和 替换(6)是最常用的命令
0, _ , {‘field’: value})新建一条记录并将其与之关联
(1, id, {‘field’: value})更新已关联记录的值
(2, id, _)移除关联并删除 id 关联的记录
(3, id, _)移除关联但不删除 id 关联的记录。通常使用它来删除many-to-many字段的关联记录
(4, id, _)关联已存在记录,仅适用于many-to-many字段
(5, _, _)删除所有关联,但不删除关联记录
(6, _, [ids])替换已关联记录列表为此处的列表
常用模型的简写
# 可用的简写元素以及加载数据的对应模型
<act_window>是窗口操作模型ir.actions.act_window
<menuitem>是菜单项模型ir.ui.menu
<report>是报表操作模型ir.actions.report.xml
<template>是存储在ir.ui.view模型中的 QWeb 模板
五.XML 文件中的其它操作
删除记录
# <delete>元素删除数据记录,使用 ID 或搜索域来定位要删除的记录
<delete
model="res.partner"
search="[('id','=',ref('library_app.res_partner_daniel'))]"
/>
# 删除记录的具体 ID,可使用 id 属性
<delete model="res.partner" id="library_app.res_partner_daniel" />
调用模型方法
# XML 文件还可以通过<function>元素在加载过程中执行任意方法,可用于设定演示和测试数据
<data noupdate="1">
<function
model="res.users"
name="_init_data_user_note_stages"
eval="[]" />
</data>