数据文件¶
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>
核心操作¶
记录
¶
记录
适当定义或更新数据库记录,它具有以下属性:
字段
¶
每个记录可以由 field
标签组成,用于定义在创建记录时要设置的值。一个没有 field
的 record
将使用所有默认值(创建时)或什么也不做(更新时)。
一个 field
必须具有一个 name
属性,用于指定要设置的字段名称,并且有多种方法用于定义该值本身:
- 无
如果未为该字段提供值,则会隐式地将该字段设置为
False
。可用于清除字段内容,或避免使用该字段的默认值。搜索
-
将评估域,使用该域搜索字段的模型,并将搜索结果设置为字段的值。如果字段是
Many2one
类型,将仅使用第一个结果。 引用
如果提供了
ref
属性,其值必须是一个有效的 外部 ID,该 ID 将被查找并设置为字段的值。类型
如果提供了
type
属性,则用于解释和转换字段的内容。字段的内容可以通过外部文件使用file
属性提供,或者通过节点的正文提供。可用类型包括:
xml
、html
提取
field
的子项作为一个文档,评估以格式%(external_id)s
指定的任何 外部 ID。%%
可用于输出实际的 % 符号。文件
确保字段内容是当前模型中的有效文件路径,并将对
{module},{path}
保存为字段值字符
将字段内容直接设置为字段的值,不进行任何修改
base64
base64 编码字段的内容,与
file
属性 结合使用时非常有用,可用于将图片数据等加载到附件中。整数
将字段的内容转换为整数并将其设置为字段的值
浮点数
将字段的内容转换为浮点数并将其设置为字段的值
列表
,元组
应包含任意数量的
value
元素,其属性与field
相同,每个元素解析为生成元组或列表的一项,生成的集合将作为字段的值。
求值
在前几种方法不适用的情况下,
eval
属性会直接计算所提供的任何 Python 表达式,并将结果作为字段的值进行设置。评估上下文包含多个模块(
time
、datetime
、timedelta
、relativedelta
),一个用于解析 外部标识符 的函数(ref
),以及如果适用的话,当前字段的模型对象(obj
)
删除
¶
delete
标签可以删除之前定义的任意数量的记录。它具有以下属性:
id
和 搜索
是互斥的
函数
¶
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 的一些重要结构模型较为复杂且涉及较多内容,数据文件提供了使用 记录标签 定义它们的简短替代方式:
模板
¶
创建一个 QWeb 视图,只需视图的 arch
部分,并允许一些 可选 属性:
CSV 数据文件¶
XML 数据文件具有灵活性和自描述性,但在批量创建同一模型的多个简单记录时会显得非常冗长。
在这种情况下,数据文件也可以使用 csv,这在 访问权限 中很常见:
文件名是
model_name.csv
第一行列出了要写入的字段,其中特殊字段
id
用于 :term:`外部标识符`(用于创建或更新)。每行之后会创建一条新记录
这里是定义国家地区 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 |
州_澳_2 |
澳大利亚 |
新南威尔士州 |
新南威尔士州 |
州_澳_3 |
澳大利亚 |
北领地 |
NT |
state_au_4 |
澳大利亚 |
昆士兰 |
Queensland |
州_澳_5 |
澳大利亚 |
南澳大利亚 |
山东省 |
州_澳_6 |
澳大利亚 |
塔斯马尼亚 |
TAS |
州_澳_7 |
澳大利亚 |
维多利亚 |
维多利亚州 |
州_澳_8 |
澳大利亚 |
西澳大利亚州 |
瓦拉瓦拉 |
美国-阿拉斯加 |
美国 |
阿拉巴马州 |
阿尔巴尼亚 |
州_美国_2 |
美国 |
阿拉斯加 |
AK |
状态:美国_3 |
美国 |
亚利桑那州 |
阿拉斯加 |
州_美国_4 |
美国 |
阿肯色州 |
阿根廷 |
州_美国_5 |
美国 |
加利福尼亚州 |
加拿大 |
州_美国_6 |
美国 |
科罗拉多州 |
状态代码 |
对于每一行(记录):