继承

实体继承

odoo提供两种机制扩展已有的实体。

第一种机制是允许一个模块继承另外一个模块的实体:

  • 为实体添加字段
  • 重载字段的定义
  • 为实体添加约束
  • 为实体添加方法
  • 重载实体的方法

第二种机制是委托(delegation),允许实体的每一条数据记录链接到父实体的数据记录,并且提供对父实体字段的透明访问。

参考:_inherit _inherits

视图继承

某些情况下,替代修改现有视图的一种方案是“视图继承”。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>

expXPath表达式,选择父视图的一个元素,如果没有元素匹配或者超过一个元素匹配都将触发错误。

position:应用于匹配元素的操作:

  • inside:在元素的最后追加 xpath的内容。
  • replace:用xpath的内容替换匹配的元素内容,( replacing any$0node 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或者单价不在 10002000之间的数据:

['|',('product_type','=','service'),
'!','&',('unit_price','>=',1000),
('unit_price','<',2000)]

领域规则domain参数在选择实体数据时可以限定实体及关联实体的数据范围。

领域规则练习

关联字段规则:4-2:当设定 Session 实体数据的 instructor 字段时,只能选择instructor等于True的 partners 数据。

openacademy/models/models.py

备注:定义为集合的领域规则是在服务器端执行的,不能动态使用规则表达式的值,定义为字符串型的规则是在客户端执行的,可以在规则值中使用字段名称。

复杂关联规则:4-3:创建 partner 的分类( Teacher / Level 1)和 (Teacher / Level 2)。session 的 instructor 字段可以选择 instructor 字段等于 True 或者分类等于 teacher(任何等级)的 partner 。

  1. 修改 Session 实体的领域规则
  2. 修改 openacademy/view/partner.xml 获取 Partner 的分类信息

openacademy/models/models.py

openacademy/views/partner.xml

results matching ""

    No results matching ""