数据文件(Data Files)¶
Odoo 是高度数据驱动的,因此模块定义的一个重要部分是其管理的各种记录的定义:用户界面(菜单和视图)、安全性(访问权限和记录规则)、报表以及普通数据都是通过记录定义的。
结构¶
在 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 用于适当地定义或更新数据库记录,它具有以下属性:
model(必填)要创建(或更新)的模型名称
id此记录的 external identifier 。强烈建议提供一个
对于记录创建,允许后续定义修改或引用此记录
对于记录修改,指定要修改的记录
context创建记录时使用的上下文
forcecreate在更新模式下,如果记录不存在,是否应创建该记录
Requires an external id, defaults to
True.
field¶
每个记录可以由 field 标签组成,定义在创建记录时要设置的值。没有 field 的 record 将使用所有默认值(创建)或不执行任何操作(更新)。
一个 field 具有一个强制的 name 属性,即要设置的字段名称,并有多种方法来定义值本身:
- 无
如果没有为字段提供值,则会在字段上隐式设置
False。可用于清除字段或避免使用字段的默认值。search-
将评估域,使用它搜索字段模型并将搜索结果设置为字段的值。如果字段是
Many2one,则只会使用第一个结果。 ref如果提供了
ref属性,则其值必须是有效的 external identifier ,它将被查找并设置为字段的值。type如果提供了
type属性,它将用于解释和转换字段的内容。字段的内容可以通过外部文件使用file属性提供,或者通过节点主体提供。可用类型包括:
xml,html提取
field的子元素作为单个文档,评估任何以%(external_id)s形式指定的 external identifier 。可以使用%%输出实际的 % 符号。file确保字段内容是当前模型中的有效文件路径,并将
{module},{path}对保存为字段值char直接将字段内容设置为字段值,不做任何更改
base64对字段内容进行 base64 编码,结合
file属性可用于加载图像数据到附件中int将字段内容转换为整数并设置为字段值
float将字段内容转换为浮点数并设置为字段值
list,tuple应包含任意数量具有与
field相同属性的value元素,每个元素解析为生成的元组或列表的一项,生成的集合被设置为字段值
eval对于前述方法不适用的情况,
eval属性会简单地评估所提供的任何 Python 表达式,并将其结果设置为字段值。评估上下文包含多个模块(
time、datetime、timedelta、relativedelta)、一个解析 external identifier 的函数(ref),以及当前字段对应的模型对象(如果适用,则为obj)。
delete¶
delete 标签可以删除先前定义的任意数量的记录。它具有以下属性:
model(必填)指定记录应被删除的模型
id要删除的记录的 external identifier
search用于查找要删除的模型记录的 域
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 部分,并允许一些 可选 属性:
idname,inherit_id,priority与
ir.ui.view上的对应字段相同(注意:inherit_id应为 external identifier )primary如果设置为
True并与inherit_id结合,将视图定义为主视图groups组 external identifier 的逗号分隔列表
page如果设置为
"True",模板是一个网站页面(可链接、可删除)optionalenabled或disabled,表示视图是否可以在网站界面中禁用及其默认状态。如果未设置,视图始终启用。
CSV 数据文件¶
XML 数据文件灵活且自描述,但在批量创建大量同一模型的简单记录时非常冗长。
在这种情况下,数据文件也可以使用 csv ,这通常适用于 访问权限 :
文件名为
model_name.csv第一行列出要写入的字段,其中特殊字段
id用于 external identifier (用于创建或更新)之后的每一行都会创建一条新记录
以下是定义国家州数据文件 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 |
名称 |
代码 |
|---|---|---|---|
state_au_1 |
澳大利亚 |
澳大利亚首都地区 |
ACT |
state_au_2 |
澳大利亚 |
新南威尔士州 |
NSW |
state_au_3 |
澳大利亚 |
北领地 |
NT |
state_au_4 |
澳大利亚 |
昆士兰州 |
QLD |
state_au_5 |
澳大利亚 |
南澳大利亚州 |
SA |
state_au_6 |
澳大利亚 |
塔斯马尼亚州 |
TAS |
state_au_7 |
澳大利亚 |
维多利亚州 |
VIC |
state_au_8 |
澳大利亚 |
西澳大利亚州 |
WA |
state_us_1 |
美国 |
阿拉巴马州 |
AL |
state_us_2 |
美国 |
阿拉斯加州 |
阿拉斯加 |
美国州代码_3 |
美国 |
亚利桑那州 |
AZ |
state_us_4 |
美国 |
阿肯色州 |
AR |
state_us_5 |
美国 |
加利福尼亚州 |
CA |
state_us_6 |
美国 |
科罗拉多州 |
CO |
对于每一行(记录):
第一列是要创建或更新的记录的 external identifier
第二列是要链接的国家对象的 external identifier (国家对象必须事先定义)
第三列是
res.country.state的name字段第四列是
res.country.state的code字段