数据文件

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 appropriately defines or updates a database record, it has the following attributes:

model (required)

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

id

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

  • 对于记录的创建,允许后续的定义修改或引用此记录

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

context

创建记录时要使用的上下文

forcecreate

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

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

field

每个记录可以由 field 标签组成,用于定义在创建记录时要设置的值。没有 fieldrecord 将使用所有默认值(创建)或不执行任何操作(更新)。

A field has a mandatory name attribute, the name of the field to set, and various methods to define the value itself:

如果没有为字段提供值,则字段上将设置一个隐式的 False 。可用于清除字段或避免使用字段的默认值。

search

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

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

ref

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

主要用于 Many2oneReference 字段

type

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

可用类型为:

xml, html

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

file

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

char

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

base64

base64 - 对字段的内容进行base64_编码,与 file attribute 结合使用,可将图像数据加载到附件中

int

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

float

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

list, tuple

应该包含任意数量的 value 元素,具有与 field 相同的属性,每个元素解析为生成的元组或列表的项,并将生成的集合设置为字段的值

eval

对于前面的方法不适用的情况, eval 属性会简单地评估提供的任何 Python 表达式,并将结果设置为字段的值。

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

delete

The delete tag can remove any number of records previously defined. It has the following attributes:

model (required)

应删除指定记录的模型

id

要删除的记录的 外部 ID

search

a domain to find records of the model to remove

idsearch 是互斥的

function

The function tag calls a method on a model, with provided parameters. It has two mandatory parameters model and name specifying respectively the model and the name of the method to call.

可以使用 eval (应该计算为要调用方法的参数序列)或 value 元素(请参见 list 值)来提供参数。

<odoo>
    <data noupdate="1">
        <record name="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 tags 定义它们的更短的替代方式:

template

创建一个 QWeb 视图,只需要视图的 arch 部分,并允许一些 可选 属性:

id

视图的 外部标识符

name, inherit_id, priority

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

primary

如果设置为 True 并与 inherit_id 结合使用,则将视图定义为主要视图

groups

逗号分隔的组 :term:`外部标识符`列表

page

如果设置为 "True",则模板是一个网页(可链接到,可删除)

optional

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

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:标识符

名称

代码

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

美国

阿拉巴马州

AL

state_us_2

美国

阿拉斯加州

AK

state_us_3

美国

亚利桑那州

AZ

state_us_4

美国

阿肯色州

AR

state_us_5

美国

加利福尼亚州

加州

state_us_6

美国

科罗拉多州

CO

对于每一行(记录):

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

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

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

  • 第四列是 code 字段,用于 res.country.state