数据文件¶
Odoo 高度由数据驱动,因此模块定义中很大一部分就是定义它所管理的各类记录:UI(菜单和视图)、安全性(访问权限和记录规则)、报表与普通数据都是通过记录来定义的。
结构¶
在 Odoo 中定义数据的主要方式是通过 XML 数据文件:XML 数据文件的总体结构如下:
根元素
odoo内可以有任意数量的操作元素
<?xml version="1.0" encoding="UTF-8"?>
<!-- the root elements of the data file -->
<odoo>
<operation/>
...
</odoo>
数据文件按顺序执行,操作只能引用先前定义的操作的结果
注解
如果数据文件的内容只应被应用一次,你可以指定 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 恰当地定义或更新数据库记录,它具有以下属性:
field¶
每个记录可以由 field 标签组成,用于定义创建记录时要设置的值。不含 field 的 record 将使用所有默认值(创建时)或不执行任何操作(更新时)。
field 有一个必填的 name 属性,即要设置的字段名称,并可通过多种方法定义值本身:
- 无
如果未为该字段提供值,则会在该字段上隐式设置
False。可用于清除字段,或避免为该字段使用默认值。search-
将对该域求值,用它搜索字段所属模型,并将搜索结果设为该字段的值。如果字段是
Many2one,则只使用第一个结果 ref如果提供了
ref属性,其值必须是有效的 外部标识符,该值将被查找并设为字段的值。主要用于
Many2one和Reference字段type如果提供了
type属性,它用于解释和转换字段的内容。字段内容可以通过file属性从外部文件提供,也可以通过节点主体提供。可用的类型包括:
xml、html将
field的子节点提取为单个文档,并求值任何以%(external_id)s形式指定的 外部标识符。可使用%%输出实际的 % 符号。file确保字段内容在当前模型中是一个有效的文件路径,并将
module,path对保存为字段值char将字段内容直接设置为字段值,不做任何改动
base64对字段内容进行 base64 编码,结合
file属性 使用时很有用,例如可将图片数据加载到附件中int将字段内容转换为整数并设置为字段值
float将字段内容转换为浮点数并设置为字段值
list,tuple应包含任意数量、具有与
field相同属性的value元素,每个元素解析为所生成元组或列表中的一项,生成的集合将设置为字段值
eval对于上述方法均不适用的情况,
eval属性会直接对给定的任意 Python 表达式求值,并将结果设置为字段值。求值上下文中包含多个模块(
time、datetime、timedelta、relativedelta)、一个用于解析 外部标识符 的函数(ref),以及适用时当前字段对应的模型对象(obj)
delete¶
delete 标签可删除任意数量先前定义的记录。它具有以下属性:
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 的一些重要结构性模型较为复杂繁琐,数据文件提供了比使用 记录标签 定义它们更简短的替代方式:
template¶
创建一个 QWeb 视图,只需视图的 arch 部分,并允许少量 可选 属性:
id视图的 外部标识符
name,inherit_id,priority与
ir.ui.view上的对应字段相同(注意:inherit_id应为 外部标识符)primary如果设为
True并与inherit_id结合使用,则将该视图定义为主视图groups以逗号分隔的用户组 外部标识符 列表
active指示该视图是否处于激活状态。若未激活,其 XPath 规则将不会被应用,因此主要与带
inherit_id的视图相关注解
直接在
<template>节点上定义active值有一个微妙之处:它只在创建记录时被考虑。后续更新时,视图会被更新,但其active状态不会。
asset¶
创建一个 资源。
示例
<asset id="website_something.some_style_asset" name="Some style asset" active="False">
<bundle>web.assets_frontend</bundle>
<path>website_something/static/src/some_style.scss</path>
</asset>
属性
id资源的 外部标识符
name与
ir.asset上的对应字段相同active(可选)指示该资源是否处于激活状态
注解
与
<template>相同,直接在<asset>节点上定义active值有一个微妙之处:它只在创建记录时被考虑。后续更新时,资源会被更新,但其active状态不会。
子元素
<bundle>与<path>用于定义
ir.asset上的对应字段(directive字段可通过<bundle>子节点上的directive属性控制)<field>(可选)与普通
<record>中一样,用于按需定义更多字段值
CSV 数据文件¶
XML 数据文件灵活且自描述,但在批量创建同一模型的大量简单记录时非常冗长。
在这种情况下,数据文件也可以使用 csv 文件格式,这在 访问权限 中很常见:
文件名是
model_name.csv第一行列出要写入的字段,其中特殊字段
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 |
澳大利亚首都领地 |
ACT |
state_au_2 |
au |
新南威尔士州 |
NSW |
state_au_3 |
au |
北领地 |
NT |
state_au_4 |
au |
昆士兰州 |
QLD |
state_au_5 |
au |
南澳大利亚州 |
SA |
state_au_6 |
au |
塔斯马尼亚州 |
TAS |
state_au_7 |
au |
维多利亚州 |
VIC |
state_au_8 |
au |
西澳大利亚州 |
WA |
state_us_1 |
us |
亚拉巴马州 |
AL |
state_us_2 |
us |
阿拉斯加州 |
AK |
state_us_3 |
us |
亚利桑那州 |
AZ |
state_us_4 |
us |
阿肯色州 |
AR |
state_us_5 |
us |
加利福尼亚州 |
CA |
state_us_6 |
us |
科罗拉多州 |
CO |
对于每一行(记录):