Odoo在很大程度上是数据驱动的, 并且很大一部分的模块定义就是它管理的不同的记录(record)的定义 : 用户界面 (菜单和视图), 安全 (访问权限和访问规则), 报表和基础数据的定义都是通过记录(record).
结构
在Odoo中定义数据的主要方式是通过 XML 数据文件: 一个XML数据文件的大致结构如下:
- 在根元素
odoo
下有任意多的操作元素
<!-- 数据文件的根元素 -->
<odoo>
<operation/>
...
</odoo>
数据文件是被按顺序进行处理的, 进行的操作只能够指向到之前已经定义好的操作
核心操作
记录(record)
记录(record)
适当的定义或者更新一个数据库的记录, 它有如下的属性:
模型(model)
(必须的)- 增加(或更新)的模型(model)的名字
id
记录(record)的 外部标识 . 强烈建议提供一个这样的标识
- 在增加记录(record)时, 允许后续的定义来修改或者参考这个记录(record)
- 在修改记录(record)是, 指向要修改的记录(record)
内容(context)
- 在增加记录(record)时使用的 context
强制更新(forcecreate)
在更新模式中, 如果记录(record)不存在的话是否创建它
需要一个 外部id, 默认为
True
.
字段(field)
每个记录(record)都可以由 字段(field)
标签组成, 定义在创建记录(record)时设置的值.
一个 记录(record)
如果没有 字段(field)
的话会使用所有默认值(创建时)
或者设么也不做(更新时).
一个 字段(field)
有一个必须的 name
属性, 设置字段(field)的名字,
和各种方法来定义它自己:
- 空
- 如果没有给这个字段(field)提供值, 一个隐藏的
False
会设置进去. 可以用于清空一个字段(field), 或者避免使用这个字段(field)的默认值. 查找(search)
用于 关系字段(field), 在这个字段(field)的model上需要一个 domain .
将会评估这个 domain, 查找使用这个字段(field)的模型(model)并且设置search的结果作为这个字段(field)的值. 如果返回的结果是一个
Many2one
则只会使用第一个结果引用(ref)
如果提供了一个
ref
属性, 他的值必须是有效值的 外部id, 其会被查找到并且设置为字段(field)的值.大部分都是为了
Many2one
和Reference
字段(field)类型(type)
如果提供了一个
type
属性, 他会被用于解释和转换字段(field)的内容. 这个字段(field)的内容会提供给一个使用file
属性的外部文件, 或者提供给这个节点的内部.可用的 type 有:
xml
,html
- 提取这个
字段(field)
的子类作为一个单独的文件, 评估任何指定为这种%(external_id)s
形式的 外部id .%%
能够用于输出 % 标识. file
- 确保字段(field)的内容是在当前模型(model)下一个有效的文件路径,
报春一对
module,path
作为字段(field)的值 char
- 设置这个字段(field)的内容不做修改的直接作为这个字段(field)的值
base64
- base64-编码了这个字段(field)的内容, 结合
file
属性 来载入, 例如图片等, 数据到附件中 int
- 转换这个字段(field)的内容为一个整数并设置它作为字段(field)的值
float
- 转换这个字段(field)的内容为一个浮点数并设置它作为字段(field)的值
list
,tuple
- 应该包含任意数量有相同性质的
值(value)
元素作为字段(field)
, 每个元素分解为一个生成的元组或者列表的元素, 并且生成的集合被设置为字段(field)的值.
评估(eval)
在前面方法不合适的情况下,
eval
属性简单的评估提供给他的python表达式并且设置 其结果为字段(field)的值.这个评估的内容包含很多的的模块 (
time
,datetime
,timedelta
,relativedelta
), 一个解析 外部标识 (ref
) 的函数和当前字段(field)的模型(model) 对象如果其是可应用的 (obj
)
删除(delete)
删除(delete)
标签可以移除任何数目之前定义的记录(record). 它有如下的属性:
模型(model)
(必须)- 需要删除的记录(record)所位于的模型(model)
id
- 需要删除的记录(record)的 外部id
查找(search)
- 一个用于查找要删除的记录(record)的 domain
id
和 查找(search)
是互斥的
函数(function)
函数(function)
标签用提供的参数来调用一个model的方法.
它有两个强制参数 模型(model)
和 name
用于指定调用的模型(model)和其名字.
参数可以用 eval
来提供(应该计算一系列参数来调用方法)
或者 值(value)
元素 (参照 list
的值).
工作流(workflow)
工作流(workflow)
标签给一个存在的工作流发送一个信号. 这个工作流可以通过一个 ref
属性来被指定
(一个存在的工作流的 外部id) 或者一个 值(value)
标签来返回一个工作流的id.
这个标签有两个强制的属性 模型(model)
(模型(model) 链接至的工作流) 和 action
(发送至工作流的信号名字).
快捷方式(Shortcuts)
因为一些Odoo的重要的结构性模型(模型(model))是复杂且关联的, 数据文件提供更短的替代名称使用 记录(record)标签 来定义他们:
模板(template)
创建一个 QWeb 视图 只需要视图的 arch
部分,
并且语序少量 可选 属性:
id
- 这个视图的 外部标识
名字(name)
,inherit_id
,优先级(priority)
- 跟
ir.ui.view
相应的字段意义相同 (注意:inherit_id
应该是一个 外部标识) 主项(primary)
- 如果设置为
True
并且结合了一个inherit_id
, 就定义这个视图为主视图 组(groups)
- 逗号分隔的组的 外部标识 列表
页面(page)
- 如果设置为
"True"
, 这个模板是会一个网页 (可链接, 可删除) 可选(optional)
enabled
或者disabled
, 决定了这个视图是不是可以被禁用 ( 在网站接口) 和他的默认状态. 如果没设置的话, 视图总是启用的.
报告(report)
创建一个有少量默认值的 ir.actions.report.xml
记录(record).
到部分只是 ir.actions.report.xml
相应字段的代理属性,
但会在报告(report)的 模型(model)
的 更多(More) 菜单中自动创建项目.
CSV 数据文件
XML 数据文件是灵活且能自我描述的, 但在创建大量相同模型上的简单记录的时候就会显得冗长.
在这种情况中, 数据文件可以使用 csv, 这是 权限管理 的常见情况:
- 文件名是
model_name.csv
- 第一行列出了需要写的字段, 有指定的字段
id
作为 外部标识 (用于创建或更新) - 以后的每行创建一个新的记录(record)
这是定义了美国州的数据文件的第一行 res.country.state.csv
用一个更易读的格式渲染后的效果:
对于每一行 (记录):
- 第一列是要创建或更新的记录的 外部id
- 第二列是要链接道德国家对象的 外部id (国家对象必须在之前定义好)
- 第三列是
res.country.state
的name
字段 - 第四列是
res.country.state
的code
字段