数据文件

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 表达式,并将结果设置为字段的值。

The evaluation context contains various modules (time, datetime, timedelta, relativedelta), a function to resolve external identifiers (ref) and the model object for the current field if applicable (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 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 tags 定义它们的更短的替代方式:

template

Creates a QWeb view requiring only the arch section of the view, and allowing a few optional attributes:

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