概念
Odoo在很大程度上是数据驱动的,因此模块定义的很大一部分是它管理的各种记录的定义:UI(菜单和视图)、安全性(访问权限和记录规则)、报告和普通数据都是通过记录定义的
Structure
在Odoo中定义数据的主要方法是通过XML数据文件:XML数据文件的广泛结构如下:
根元素odo中任意数量的操作元素
<!-- the root elements of the data file -->
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<operation/>
...
</odoo>
数据文件按顺序执行,操作只能引用前面定义的操作结果
注:
如果数据文件的内容预计只应用一次,您可以指定odo标志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>
Core operations
-
record
记录适当地定义或更新数据库记录,它具有以下属性:-
model (必须)
要创建(或更新)的模型名称 -
id
此记录的外部标识符。强烈建议提供一个-
对于记录创建,允许后续定义修改或引用此记录
-
对于记录修改,要修改的记录
-
-
context
创建记录时使用的上下文 -
forcecreate
在更新模式下,如果记录不存在,是否应该创建它需要一个外部id,默认为True。
-
-
field
每条记录都可以由字段标签组成,定义创建记录时要设置的值。没有字段的记录将使用所有默认值(创建)或不执行任何操作(更新)。
字段具有强制名称属性、要设置的字段名称以及定义值本身的各种方法:Nothing
如果没有为该字段提供值,则将在该字段上设置隐式False。可用于清除字段,或避免使用字段的默认值。-
search
对于关系字段,应该是字段模型上的域。将评估域,使用它搜索字段的模型并将搜索结果设置为字段的值。仅当字段是Many2one时才会使用第一个结果
-
ref
如果提供了ref属性,其值必须是有效的外部id,将被查找并设置为字段的值主要用于Many2one和参考字段
-
type
如果提供了类型属性,则用于解释和转换字段的内容。字段的内容可以通过使用文件属性的外部文件提供,也可以通过节点的主体提供可用类型有:
-
xml, html
将字段的子级提取为单个文档,计算使用%(external_id)s形式指定的任何外部id。%%可用于输出实际的%符号 -
file
确保字段内容是当前模型中的有效文件路径,将对模块、路径保存为字段值 -
char
将字段内容直接设置为字段的值而不进行更改 -
base64
base64-编码字段的内容,与文件属性结合使用以加载例如有用。图像数据到附件中 -
int
将字段的内容转换为整数并将其设置为字段的值 -
float
将字段的内容转换为浮点数并将其设置为字段的值 -
list, tuple
应包含任意数量的值元素,其属性与field相同,每个元素解析为生成的元组或列表的一个项目,并将生成的集合设置为字段的值
-
-
eval
对于前面的方法不合适的情况,eval属性只是评估它提供的任何Python表达式,并将结果设置为字段的值评估上下文包含各种模块(time、datetime、timedelta、relativedelta)、解析外部标识符的函数(ref)和当前字段的模型对象(obj)
-
-
delete
删除标签可以删除之前定义的任意数量的记录。它具有以下属性:-
model (必须)
应删除指定记录的模型 -
id
要删除的记录的外部ID -
search
查找要删除的模型记录的域id和搜索是独占的
-
-
function
函数标签调用模型上的方法,并提供参数。它有两个强制参数model和name,分别指定要调用的模型和方法的名称可以使用eval(应该评估为调用方法的参数序列)或value元素(请参阅列表值)提供参数。
<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>
Shortcuts
由于Odoo的一些重要结构模型复杂且涉及,因此数据文件提供了使用记录标签定义它们的更短替代方案
-
menuitem
定义包含许多默认值和回退的 ir.ui.menu 记录:-
parent
如果设置了父属性,它应该是其他菜单项的外部id,用作新项目的父属性如果没有提供父级,则尝试将name属性解释为菜单名称的 /-separated序列,并在菜单层次结构中找到一个位置。在这种解释中,会自动创建中间菜单
否则,菜单将被定义为“顶级”菜单项(不是没有父级的菜单)
-
name
如果未指定name属性,则尝试从链接操作中获取菜单名称(如果有)。否则使用记录的ID -
groups
组属性被解释为 res.groups 模型的外部标识符的逗号分隔序列。如果外部标识符以减号(-)为前缀,则该组将从菜单的组中删除 -
action
如果指定,action属性应该是打开菜单时要执行的操作的外部ID -
id
菜单项的外部ID
-
-
template
创建一个QWeb视图,只需要视图的拱形部分,并允许一些可选属性:-
id
视图的外部标识符 -
name, inherit_id, priority
与 ir.ui.view 对应字段相同(nb:inherit_id应该是外部标识符) -
primary
如果设置为True并与inherit_id组合,则将视图定义为主视图 -
groups
组外部标识符的逗号分隔列表 -
page
如果设置为“True”,则模板为网站页面(可链接到、可删除) -
optional
启用或禁用,视图是否可以禁用(在网站界面中)及其默认状态。如果未设置,则始终启用视图。
-
CSV data files
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
第二列是要链接到的国家对象的外部id(国家对象必须事先定义)
第三列是 res.country.state的名称字段
第四列是 res.country.state的代码字段
注:以上是对于odoo文档下Python framework的Data Files的翻译