数据文件

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>

核心操作

记录

记录 适当定义或更新数据库记录,它具有以下属性:

模型 (必填)

要创建(或更新)的模型名称

编号

此记录的 外部标识符。强烈建议提供一个。

  • 在记录创建时,允许后续定义对该记录进行修改或引用

  • 对于记录修改,要修改的记录

上下文

创建记录时使用的上下文

强制创建

在更新模式下,如果记录不存在是否应创建该记录

需要一个 外部 ID,默认值为 True

字段

每个记录可以由 field 标签组成,用于定义在创建记录时要设置的值。一个没有 fieldrecord 将使用所有默认值(创建时)或什么也不做(更新时)。

一个 field 必须具有一个 name 属性,用于指定要设置的字段名称,并且有多种方法用于定义该值本身:

如果未为该字段提供值,则会隐式地将该字段设置为 False。可用于清除字段内容,或避免使用该字段的默认值。

搜索

对于 关系字段,应为该字段模型上的

将评估域,使用该域搜索字段的模型,并将搜索结果设置为字段的值。如果字段是 Many2one 类型,将仅使用第一个结果。

引用

如果提供了 ref 属性,其值必须是一个有效的 外部 ID,该 ID 将被查找并设置为字段的值。

主要用于 Many2oneReference 字段

类型

如果提供了 type 属性,则用于解释和转换字段的内容。字段的内容可以通过外部文件使用 file 属性提供,或者通过节点的正文提供。

可用类型包括:

xmlhtml

提取 field 的子项作为一个文档,评估以格式 %(external_id)s 指定的任何 外部 ID%% 可用于输出实际的 % 符号。

文件

确保字段内容是当前模型中的有效文件路径,并将对 {module},{path} 保存为字段值

字符

将字段内容直接设置为字段的值,不进行任何修改

base64

base64 编码字段的内容,与 file 属性 结合使用时非常有用,可用于将图片数据等加载到附件中。

整数

将字段的内容转换为整数并将其设置为字段的值

浮点数

将字段的内容转换为浮点数并将其设置为字段的值

列表元组

应包含任意数量的 value 元素,其属性与 field 相同,每个元素解析为生成元组或列表的一项,生成的集合将作为字段的值。

求值

在前几种方法不适用的情况下,eval 属性会直接计算所提供的任何 Python 表达式,并将结果作为字段的值进行设置。

评估上下文包含多个模块(timedatetimetimedeltarelativedelta),一个用于解析 外部标识符 的函数(ref),以及如果适用的话,当前字段的模型对象(obj

删除

delete 标签可以删除之前定义的任意数量的记录。它具有以下属性:

模型 (必填)

应删除的指定记录所属的模型

编号

要删除的记录的 外部 ID

搜索

一个用于查找要删除的模型记录的

id搜索 是互斥的

函数

function 标签用于在模型上调用方法,并提供参数。它有两个必填参数 modelname,分别指定要调用的方法的模型和名称。

参数可以通过 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 部分,并允许一些 可选 属性:

编号

该视图的 外部标识符

名称继承ID优先级

ir.ui.view 上的对应字段相同(注:inherit_id 应该是一个 外部标识符

如果设置为 True 并与 inherit_id 一起使用,则将视图定义为主视图

用逗号分隔的用户组 外部标识符 列表

页面

如果设置为 "True", 该模板是一个网站页面(可链接、可删除)

可选

启用禁用,表示该视图是否可以被禁用(在网站界面中)及其默认状态。如果未设置,则视图始终处于启用状态。

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

美国

科罗拉多州

状态代码

对于每一行(记录):

  • 第一列是要创建或更新的记录的 外部 ID

  • 第二列是要链接的国家对象的 :term:`外部 ID`(国家对象必须事先定义好)

  • 第三列是 res.country.statename 字段

  • 第四列是 res.country.statecode 字段