数据文件¶
Odoo 高度数据驱动,因此模块定义的很大一部分就是定义它所管理的各种记录:UI(菜单和视图)、安全(访问权限和记录规则)、报表以及普通数据都通过记录来定义。
结构¶
在 Odoo 中定义数据的主要方式是通过 XML 数据文件:XML 数据文件的大致结构如下:
根元素
odoo内可以包含任意数量的操作元素
<?xml version="1.0" encoding="UTF-8"?>
<!-- the root elements of the data file -->
<odoo>
<operation/>
...
</odoo>
数据文件按顺序执行,操作只能引用先前定义的操作的结果
Note
如果数据文件的内容预期只应用一次,可以指定 odoo 标志 noupdate 设为 1。如果文件中只有部分数据预期应用一次,可以将这部分内容放入 <data noupdate=”1”> 域中。
<odoo>
<data noupdate="1">
<!-- Only loaded when installing the module (odoo-bin -i module) -->
<operation/>
</data>
<!-- (Re)Loaded at install and update (odoo-bin -i/-u) -->
<operation/>
</odoo>
核心操作¶
record¶
record 用于定义或更新一条数据库记录,它具有以下属性:
model(必填)要创建(或更新)的模型名称
id该记录的 external identifier (外部标识符)。强烈建议提供。
创建记录时,允许后续定义修改或引用该记录
修改记录时,指定要修改的记录
context创建记录时使用的上下文
forcecreate在更新模式下,如果记录不存在是否应创建它
需要 external id,默认为
True。
field¶
每条记录可以由 field 标签组成,定义创建记录时要设置的值。没有 field 的 record 将使用所有默认值(创建)或不做任何事(更新)。
field 有一个必填的 name 属性,即要设置的字段名称,并有多种定义值本身的方法:
- 无
如果字段未提供值,将在字段上隐式设置
False。可用于清空字段,或避免使用字段的默认值。search-
将对该域求值,用它在字段的模型上搜索,并将搜索结果设为字段的值。如果字段是
Many2one,则只使用第一个结果 ref如果提供了
ref属性,其值必须是有效的 external id,将被查找并设为字段的值。主要用于
Many2one和Reference字段type如果提供了
type属性,将用它来解释和转换字段的内容。字段内容可以通过file属性由外部文件提供,或通过节点的正文提供。可用类型有:
xml,html将
field的子节点提取为单个文档,对以%(external_id)s形式指定的 external id 外部标识符进行求值。%%可用于输出实际的 % 符号。file确保字段内容是当前模型中的有效文件路径,并将
module,path这一对值保存为字段值char将字段内容不加修改地直接设为字段值
base64对字段内容进行 base64 编码,配合
file属性 使用,例如可将图片数据加载到附件中int将字段内容转换为整数并设为字段值
float将字段内容转换为浮点数并设为字段值
list,tuple应包含任意数量的
value元素,其属性与field相同;每个元素会解析为所生成元组或列表中的一项,生成的集合将设为字段值
eval在前述方法不适用的情况下,
eval属性会直接对其提供的任意 Python 表达式求值,并将结果设为字段值。求值上下文包含多个模块(
time、datetime、timedelta、relativedelta)、一个用于解析 external identifiers 外部标识符的函数(ref),以及适用时当前字段所属的模型对象(obj)
delete¶
delete 标签可删除任意数量的先前定义的记录。它具有以下属性:
model(必填)要在其中删除指定记录的模型
id要移除的记录的 external id 外部标识符
search一个用于查找该模型中待移除记录的 domain 域
id 和 search 互斥
function¶
function 标签会以提供的参数调用某个模型上的方法。它有两个必选参数 model 和 name,分别指定模型以及要调用的方法名称。
参数可通过 eval 应求值为调用方法所用的一系列参数)或 value 元素(参见 list 值)来提供。
<odoo>
<data noupdate="1">
<record id="partner_1" model="res.partner">
<field name="name">Odude</field>
</record>
<function model="res.partner" name="send_inscription_notice"
eval="[[ref('partner_1'), ref('partner_2')]]"/>
<function model="res.users" name="send_vip_inscription_notice">
<function eval="[[('vip','=',True)]]" model="res.partner" name="search"/>
</function>
</data>
<record id="model_form_view" model="ir.ui.view">
...
</record>
</odoo>
快捷方式¶
由于 Odoo 中一些重要的结构化模型复杂而繁琐,数据文件为使用 record 标签 定义它们提供了更简短的替代方式:
template¶
创建一个 QWeb 视图,只需提供视图的 arch 部分,并允许一些 可选 属性:
id视图的 external identifier 外部标识符
name,inherit_id,priority与
ir.ui.view上的对应字段相同(注意:inherit_id应为 external identifier 外部标识符)primary如果设为
True且与inherit_id组合使用,则将该视图定义为主视图groups群组 external identifiers 外部标识符的逗号分隔列表
page如果设为
"True",该模板就是一个网站页面(可链接至、可删除)optionalenabled或disabled,表示视图是否可以被禁用(在网站界面中)及其默认状态。未设置时,视图始终启用。
CSV 数据文件¶
XML 数据文件灵活且自描述性强,但在批量创建同一模型的多个简单记录时非常冗长。
对于这种情况,数据文件也可以使用 csv 格式,访问权限 就是常见的情况:
文件名为
model_name.csv第一行列出要写入的字段,其中包括用于 external identifiers 外部标识符的特殊字段
id用于创建或更新)其后的每一行都会创建一条新记录
以下是定义国家州/省的 res.country.state.csv 数据文件的前几行
"id","country_id:id","name","code"
state_au_1,au,"Australian Capital Territory","ACT"
state_au_2,au,"New South Wales","NSW"
state_au_3,au,"Northern Territory","NT"
state_au_4,au,"Queensland","QLD"
state_au_5,au,"South Australia","SA"
state_au_6,au,"Tasmania","TAS"
state_au_7,au,"Victoria","VIC"
state_au_8,au,"Western Australia","WA"
state_us_1,us,"Alabama","AL"
state_us_2,us,"Alaska","AK"
state_us_3,us,"Arizona","AZ"
state_us_4,us,"Arkansas","AR"
state_us_5,us,"California","CA"
state_us_6,us,"Colorado","CO"
以更易读的格式呈现:
id |
country_id:id |
name |
code |
|---|---|---|---|
state_au_1 |
au |
Australian Capital Territory |
ACT |
state_au_2 |
au |
New South Wales |
NSW |
state_au_3 |
au |
Northern Territory |
NT |
state_au_4 |
au |
Queensland |
QLD |
state_au_5 |
au |
South Australia |
SA |
state_au_6 |
au |
Tasmania |
TAS |
state_au_7 |
au |
Victoria |
VIC |
state_au_8 |
au |
Western Australia |
WA |
state_us_1 |
us |
Alabama |
AL |
state_us_2 |
us |
Alaska |
AK |
state_us_3 |
us |
Arizona |
AZ |
state_us_4 |
us |
Arkansas |
AR |
state_us_5 |
us |
California |
CA |
state_us_6 |
us |
Colorado |
CO |
对于每一行(记录):
第一列是要创建或更新的记录的 external id 外部标识符
第二列是要关联的国家对象的 external id 外部标识符(国家对象必须事先已定义)
第三列是
res.country.state的name字段第四列是
res.country.state的code字段