Odoo 以数据为导向,因此模块定义的一个重要部分就是其管理的各种记录的定义:用户界面(菜单和视图)、安全性(访问权限和记录规则)、报告和普通数据都是通过记录定义的。
结构
在 Odoo 中定义数据的主要方式是通过 XML 数据文件:XML 数据文件的大致结构如下:
<?xml version="1.0" encoding="UTF-8"?>
<!-- the root elements of the data file -->
<odoo><operation/>...
</odoo>
root根元素里可以包含任意多的子操作。
数据文件按顺序执行,操作只能引用之前定义的操作结果
如果数据文件的内容只需要执行一次,您可以指定 odoo 标志 noupdate 设置为 1。您可以将这部分文件放在 <data noupdate="1"> 域中。
<odoo><data noupdate="1"><!-- 只在安装模块的时候加载一次 --><operation/></data><!-- 在安装和更新模块时都会重新加载 --><operation/>
</odoo>
核心操作
record
记录定义或更新数据库记录,它具有以下属性:
model
(required) 要创建(或更新)的模型名称- id 该记录的外部标识符external identifier。强烈建议提供一个 (在创建记录时,允许后续定义修改或引用该记录,修改记录时也需要引用这个id
-
context 创建记录时使用的上下文
-
forcecreate 在更新模式下,如果记录不存在,是否应创建该记录, 需要外部标识符,默认值为True
field
每条记录都可以由字段标组成,定义创建记录时要设置的值。没有字段的记录将使用所有默认值(创建)或不做任何操作(更新)。
一个字段有一个强制的 name 属性、要设置的字段名称以及定义值本身的各种方法:
如果未为字段提供值,则会在该字段上设置隐式 False。可用于清除字段,或避免使用字段的默认值。
search
对于关系字段,应该是字段模型上的一个域domain。
查询条件,并将查询结果设置为字段值。如果字段是 Many2one,则只使用第一个结果。
ref
如果提供 ref 属性,其值必须是一个有效的外部 ID,该 ID 将被查找并设置为字段的值。
主要用于 Many2one 和 Reference 字段
type
如果提供了 type 属性,它将用于解释和转换字段内容。字段内容可以通过使用 file 属性的外部文件提供,也可以通过节点的正文提供。
type的有效值如下:
xml
,html,
file, char, base64, int, float,list
,tuple
eval
在前几种方法都不适用的情况下,eval 属性可以简单地对所提供的 Python 表达式进行求值,并将结果设置为字段的值。
context默认包含一下python模块time
, datetime
, timedelta
, relativedelta
下一篇文章讲详解eval的用法。
delete
删除标记可以删除任意数量的先前定义的记录。它具有以下属性:
model(必填)
应删除指定记录的模型
id
要删除记录的外部 id
search
用于查找要删除的模型记录的域
id 和 search 是排他的,不能同时使用
function
函数标签使用提供的参数在模型上调用一个方法。它有两个必选参数 model 和 name,分别指定要调用的模型和方法名称。
提供参数时,可以使用 eval(应求值为调用方法的参数序列)或值元素(见列表值)。
<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 属性解释为菜单名称的/分隔序列,并在菜单层次结构中查找位置。在这种解释中,会自动创建中间菜单
否则,菜单将被定义为 "顶层 "菜单项(不是无父菜单)
name如果没有指定 name 属性,则会尝试从链接操作(如果有)中获取菜单名称。否则将使用记录的 id
groupsgroups 属性被解释为以逗号分隔的 res.groups 模型外部标识符序列。如果外部标识符前缀为减号(-),则该组将从菜单的组中删除
action如果指定,action 属性应是打开菜单时要执行的操作的外部 id
id
菜单项的外部 id
template
创建 QWeb 视图,只需要视图的框架部分,并允许使用一些可选属性:
id
视图的外部标识符
name、inherit_id、priority
与 ir.ui.view 中的相应字段相同(注:herit_id 应为外部标识符)
primary如果设置为 "true "并与 inherit_id 结合使用,则将视图定义为主视图
groups用逗号分隔的组外部标识符列表
page如果设置为 "True",则模板为网站页面(可链接到,可删除)
optional启用
enabled或禁用
disabled,视图是否可以被禁用(在网站界面中)及其默认状态。如果未设置,则视图始终处于启用状态。
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 | 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 的代码字段