ODOO
1、 基础
1.1、模型 —— 元数据
元数据(metadata)是指描述模型的数据,这些数据即前头带了下划线的模型属性
元数据 | 描述 |
---|---|
_name | 作为数据表名的参考 |
_rec_name | 当一个字段值是一条记录时,这条记录要挑一个出来做代表 |
_description | 对模型的简短描述 |
_inherit | 指定继承自哪个模型,用于扩展现有模型的功能 |
_mixins | 混入其他类,用于符合和组合功能 |
_order | 指定查询数据时默认的排序方式 |
_security | 定义访问模型的权限和安全规则 |
_defaults | 设置字段的默认值 |
_constraints | 定义字段值的约束条件 |
_sql_constraints | 定义 SQL 级别的约束条件 |
_auto | 指定是否自动创建数据表,通常用于虚拟模型 |
1.2、模型 —— 字段属性
Odoo 中用于定义字段的属性和参数,它们用于控制字段的行为和显示方式
字段属性 | 值类型 | 描述 |
---|---|---|
string | str | 标签名 |
required | bool | 指定是否必填 |
readonly | bool | 指定是否只读 |
default | str | 指定默认值 |
help | str | 鼠标悬停显示的帮助文本 |
index | bool | 指定是否创建索引 |
compute | method | 指定计算数学使用的方法 |
inverse | method | 接定义计算字段的逆方法 |
store | bool | 指定是否要将计算字段存储在数据库中 |
comodel_name | str | 关联的模型 |
related | str | 关联其他模型的字段 |
size | int | 指定字符型字段的大小限制 |
digits | tuple | 指定浮点数字段的精度,元组的第一个值表示总位数,第二个值表示小数点的位数 |
groups | str | 用于指定特定组的用户才具有访问权限 |
domain | str | 用于视图中过滤该字段的可选值 |
ondelete | str | 指定当关联记录被删除时的行为 ① cascade:级联删除,删除主记录时会删除相关联的所有子记录 ② restrict:约束删除,不允许删除主记录,只有在没有关联的子记录时才允许删除 ③ set null:删除主记录时,关联的外键字段将被设置为 null |
1.3、视图 —— record 标签
普通视图的字段 | 描述 |
---|---|
name | 视图名称 |
model | 关联的模型 |
priority | 用于标识记录的优先级或重要性级别 |
mode | 指定视图的类型或显示模式 primary:主视图 secondary:次视图 |
inherit_id | 指示当前视图继承自哪个视图,需要通过标签属性 ref 来指示 |
arch | 指定 field 标签内部的结构,常见搭配 type=“xml” 的时候 |
动作视图的字段 | 描述 |
---|---|
name | 视图名称 |
res_model | 关联的模型 |
view_id | 执行动作时,默认加载的视图的 ID,需要通过标签属性 ref 来指示 |
view_mode | 指定动作所支持的视图模式的顺序和类型 tree:树形视图、kanban:看板视图、form:表单视图 calendar:日历视图、pivot:透视图、graph:图表视图 activity活动视图 |
search_view_id | 搜索视图的 ID,需要通过 ref 属性来指示 |
context | 一个字典类型的数据结构,用于在不同的 Odoo 环境(如视图、模型、动作等)之间传递信息 |
help | 用于提供帮助信息,可以结合 type=“html” 来写帮助信息 |
1.4、视图 —— 控件、样式
控件 | 描述 | 常见属性搭配 |
---|---|---|
badge | 徽章 | decoration-muted:灰色 decoration-warning:黄色 decoration-info:蓝色 decoration-success:绿色 decoration-danger:红色 |
statusbar | 状态栏 | statusbar_visible:可视性 statusbar_colors:为不同状态指定不同的颜色,例如statusbar_colors=‘{“cancel”:“red”}’ |
many2many_tags | 小标签 | color_field:标签颜色,例如options=“{‘color_field’: ‘color’}” |
progressbar | 进度条 | - |
handle | 拖动手柄 | |
image | 图像 | |
monetary | 货币格式 | |
邮件 | ||
url | 超链接 |
样式 | 描述 |
---|---|
按钮颜色 | btn-primary:蓝色 btn-secondary:灰色 btn-success:绿色 btn-danger:红色 btn-warning:黄色 btn-info:青色 |
1.4、视图 —— 视图继承
replace 字段值 | 描述 |
---|---|
replace | 替换目标元素及其内容 |
before | 将新元素插到目标元素之前 |
after | 将新元素插到目标元素之后 |
inside | 将新元素插到目标元素内部 |
outside | 将新元素插到目标元素的外部(这个使用比较少) |
attributes | 修改目标元素的属性 |
<!-- 修改tree标签属性 -->
<tree position="attributes">
<attribute name="string">Quotations</attribute>
</tree>
<!-- 修改字段 -->
<field name="date_order" position="replace">
<field name="create_date" string="Creation Date" widget="date" optional="show"/>
</field>
当然,可以使用 xpath 进行定位
路径表达式 | 描述 | 举例 |
---|---|---|
/ | 所有直接子节点 | //div/a —— 文档中所有div标签的所有直接 a 子标签 /html/div —— 从根节点出发选取(绝对路径) |
// | 所有子节点 | //div//a —— 文档中所有div标签的所有 a 子标签中 |
. | 当前节点 | .//div —— 当前标签下的所有div标签 ./@class —— 当前标签的class属性 |
.. | 选取当前节点的父节点 | ..//div —— 当前标签的父标签下所有的div标签 |
@ | 选取属性 | //input[@id=“kw”] —— 文档中所有id为kw的input标签 |
通配符 | 描述 | 举例 |
---|---|---|
* | 所有标签 | //div/* —— 文档中所有div标签下的所有标签 |
@* | 所有属性 | //div/@* —— 文档中所有div标签下的所有标签 |
type() | 类型 | //button[text()=“登录”] —— 文档中type:text值为登录的所有按钮 |
定位 | 描述 | 举例 |
---|---|---|
contains() | 模糊定位( 包含 ) | //*[contains(text(),‘cc’)] —— 文档中包含文本cc的所有标签 |
starts-with() | 模糊定位( 以…开头 ) | //*[starts-with(@title,‘ss’)] —— 文档中title字段以ss开头的所有标签 |
ends-with() | 模糊定位( 以…结尾 ) | //*[ends-with(text(),‘ee’)] —— 文档中以ee结尾的所有标签 |
and、or、not | 逻辑定位( 与或非 ) | //div[@attribute=‘aa’ and contains(text(),‘abc’)] —— 文档中attribute为aa且text包含abc的div标签 |
following-sibling:: | 轴定位( 相邻的兄弟标签 ) | //div[@class=‘c1’]/following-sibling::div[@class=‘c2’] —— 文档中class为c1的div标签的class为c2的div兄弟标签 |
follow:: | 轴定位( 全文档中当前标签之后的标签 ) | / |
following-sibling:: | 轴定位( 同一个父标签下当前标签之后的兄弟标签 ) | //div[@class=‘c1’]/following-sibling::div[@class=‘c2’] —— 文档中class为c1的div标签的class为c2的div兄弟标签 |
preceding:: | 轴定位( 全文档中当前标签之前的标签 ) | / |
preceding-sibling:: | 轴定位( 同一个父标签下当前标签之前的兄弟标签 ) | / |
child:: | 轴定位( 当前标签的所有子标签 ) | / |
parent:: | 轴定位( 当前标签的直接父标签 ) | / |
ancestor:: | 轴定位( 当前标签的所有祖先标签 ) | / |
下标 | 描述 | 举例 |
---|---|---|
(标签)[n] | 一组标签的第n个 | (//div)[n] —— 文档中所有div标签的第n个标签 |
(标签)[last()] | 一组标签的最后一个 | (//div)[last()-n+1] —— 文档中所有div标签的倒数第n个标签 |
<xpath expr="//tree" position="attributes">
<attribute name="banner_route">/onboarding/sale_quotation</attribute>
</xpath>
1.5、self.env
常用属性 | 描述 |
---|---|
self.env.user | 表示 res.users 模型的一个实例 —— 当前用户 res.users.name:当前用户的名称 |
self.env.context | :当前的上下文(context)字典,包含了调用模型方法时的附加信息 |
self.env.cr | 当前的数据库游标(cursor),用于直接执行数据库操作 |
self.env.registry | 块注册表,用于访问所有已注册的模型和方法 |
常用方法 | 描述 |
---|---|
self.env[‘模型名’] | 访问某个模型,可以通过它来调用对应模型的方法 |
self.env[‘模型名’].search([(‘field’, ‘=’, value)]) | 执行模型的搜索操作,返回符合条件的记录集 |
self.env[‘模型名’].search_count([(‘field’, ‘=’, value)]) | 执行模型的搜索操作,返回符合条件的记录数 |
self.env[‘模型名’].create(字典) | 创建新记录,返回新创建的记录实例 |
self.env[‘模型名’].write(values) | 更新记录的字段值,通常用于批量更新 |
self.env[‘模型名’].unlink() | 删除记录,通常用于删除模型中的记录 |
self.env[‘模型名’].browse(ids) | 根据 ID 列表访问记录,返回记录集 |
self.env[‘模型名’].fields_get() | 获取模型字段的详细信息 |
self.env.ref(‘模型的.xml_id’) | 根据xml_id查找记录 |
1.6、context
在 Odoo 中,context 是一个用于在不同操作和视图之间传递参数和控制行为的机制。它可以被认为是一个字典,在其中存储了各种键值对,这些键值对会影响系统的行为方式、数据处理、视图显示、默认值设置等,例如
context 常用的键名 | 描述 |
---|---|
default_属性 | 设置模型字段的默认值 |
<!-- 目的:点击 tree 视图的创建按钮,然后给 form 视图中的记录设置默认值 -->
<record id="action_test_student" model="ir.actions.act_window">
<field name="name">Action Test Student</field>
<field name="res_model">test.student</field>
<field name="view_mode">tree,form</field>
<field name="context">{'default_gender': 'male'}</field>
</record>
分析:由于创建这个按钮调用的是 ir.actions.act_window 这个模型的方法,以让对应的 form 视图呈现出来,因此当要创建一条记录的时候,应该让动作记录来传达上下文
<!-- 目的:想要在一对多字段创建多方的一条数据 -->
<record id=&