继承
实体继承
odoo提供两种机制扩展已有的实体。
第一种机制是允许一个模块继承另外一个模块的实体:
- 为实体添加字段
- 重载字段的定义
- 为实体添加约束
- 为实体添加方法
- 重载实体的方法
第二种机制是委托(delegation),允许实体的每一条数据记录链接到父实体的数据记录,并且提供对父实体字段的透明访问。
视图继承
某些情况下,替代修改现有视图的一种方案是“视图继承”。odoo提供的视图继承机制,子视图扩展根视图(applied on top of root),可以添加或删除继承的父视图的内容。
扩展视图使用inherit_id
字段引用其父视图, 在arch
字段中使用多个xpath
元素选择或修改其父视图的内容:
<!-- improved idea categories list -->
<record id="idea_category_list2" model="ir.ui.view">
<field name="name">id.category.list2</field>
<field name="model">idea.category</field>
<field name="inherit_id" ref="id_category_list"/>
<field name="arch" type="xml">
<!-- find field description and add the field
idea_ids after it -->
<xpath expr="//field[@name='description']" position="after">
<field name="idea_ids" string="Number of ideas"/>
</xpath>
</field>
</record>
exp
:XPath表达式,选择父视图的一个元素,如果没有元素匹配或者超过一个元素匹配都将触发错误。
position
:应用于匹配元素的操作:
inside
:在元素的最后追加xpath
的内容。replace
:用xpath
的内容替换匹配的元素内容,( replacing any$0
node occurrence in the new body with the original element)before
:在匹配的元素前面以“同级(sibling)”方式插入xpath
的内容。after
:在匹配元素的后面以“同级(sibling)“的方式插入xpaths
的内容。attributes
:使用xpath
中指定的attribute
元素信息修改匹配元素的属性。
提示:当匹配到一个元素,
position
属性将直接应用到该元素,后续的继承视图将有同样的结果。
<xpath expr="//field[@name='description']" position="after">
<field name="idea_ids" />
</xpath>
<field name="description" position="after">
<field name="idea_ids" />
</field>
视图继承练习:4-1
修改视图内容:
- 使用实体继承,修改Partner实体,增加一个
instructor
布尔型字段,并且添加一个 session-partner 的 many2many 的关联关系;- 使用视图继承,在 partner 表单视图中显示这些字段;
备注:可以通过开发者模式检测视图信息,获取外部标识(external ID)以及要匹配的元素,以及放置的位置信息等。
openacademy/__manifest__.py
openacademy/__init__.py
openacademy/models/partner.py
openacademy/views/partner.xml警告:odoo网站的 openacademy/__init\_.py _文件内容有误
from . import partner # 应该修订为 from .models import partner # 或者修改 openacademy/models/__init__.py 文件 from . import models from . import partner
更新模块
更新模块,查看运行效果:
领域规则-Domains
在 odoo 中,Domains 是作用于数据记录集合的一组条件,一个领域规则就是选择记录的过滤条件,每个条件由“字段名(field name)”、“操作符(operator)”和“值(value)”三个元素组成。例如:对于业务实体 Product ,下面的规则(Domain)选择所有产品类型等于 services
, 并且单价大于 1000
的数据:
[('product_type','=','service'),('unit_price','>',1000)]
缺省情况下,条件用 “与” 操作符连接,逻辑操作符:&
(AND),|
(OR) 和!
(NOT) 可用于连接条件。逻辑操作符放在条件的前面作为条件的前缀(操作符放在参数的前面,而不是放在参数中间)。例如:对于业务实体 Product 选择产品类型等于 service
或者单价不在 1000
和2000
之间的数据:
['|',('product_type','=','service'),
'!','&',('unit_price','>=',1000),
('unit_price','<',2000)]
领域规则domain
参数在选择实体数据时可以限定实体及关联实体的数据范围。
领域规则练习
关联字段规则:4-2:当设定 Session 实体数据的 instructor 字段时,只能选择
instructor
等于True
的 partners 数据。备注:定义为集合的领域规则是在服务器端执行的,不能动态使用规则表达式的值,定义为字符串型的规则是在客户端执行的,可以在规则值中使用字段名称。
复杂关联规则:4-3:创建 partner 的分类( Teacher / Level 1)和 (Teacher / Level 2)。session 的 instructor 字段可以选择 instructor 字段等于 True 或者分类等于 teacher(任何等级)的 partner 。
- 修改 Session 实体的领域规则
- 修改 openacademy/view/partner.xml 获取 Partner 的分类信息