zoukankan      html  css  js  c++  java
  • Odoo模块开发教程3-模块继承之修改视图和数据第四讲

    使用代理继承内嵌模型

    使用代理继承无需复制数据即可在数据库中复用数据结构,这通过将一个模型嵌入另一个来实现。 UML 中这种称作组合(composition)关系:父类无需子类即可存在,而子类必须要有父类才能存在。
    比如,对于内核 User 模型,每条记录包含一条 Partner 记录,因此包含 Partner 中的所有字段以及 User 自身的一些字段。
    在图书项目中,我们要添加一个图书会员模型。会员有会员卡并通过会员卡借阅读书。我们要记录卡号,还要存储 email 和地址这类个人信息。 Partner 模型已包含联系和地址信息,所以最好是进行复用,而不去创建重复的数据结构。为会员模型创建 library_member/models/library_member.py 文件并加入如下代码:
    from odoo import fields, models
    class Member(models.Model):
    _name = 'library.member'
    _description = 'Library Member'
    card_number = fields.Char()
    partner_id = fields.Many2one(
    'res.partner',
    delegate=True,
    ondelete='cascade',
    required=True)
    使用代理继承, library.member 中嵌入了继承模型 res.partner,因此在创建会员记录时,一个关联的 Partner 会自动被创建并通过 partner_id 字段引用。
    “ 注意: Odoo 8 的修改在新的 API 中引入了 delegate=True 字段属性。在那之前,代理继承通过模型属性来定义,类似_inherits = {‘res.partner’ : ‘partner_id’ }。现在仍支持这一写法,官网中还有相应介绍,但 delegate=True 字段属性可起到相同效果且使用更简单。 ”
    透过代理机制, 嵌套模型的所有字段就像父模型字段一样自动可用。本例中,会员卡模型可使用Partner 中的所有字段,如 name, address 和 email,以及会员自身的独有字段,如card_number。在后台中, Partner 字段存储在关联的 Partner 记录,没有重复的数据结构。
    “ 小贴士: 对于模型方法则并非如此, Partner 模型中的方法在 Member 模型中不可使用。 ”与原型继承相比,代理继承的好处在于无需跨表重复像地址这样的数据。任何需包含地址的新模
    型通过代理嵌入了 Partner 模型。如果在 Partner 中修改 address 字段,在所有嵌入的模型中可以马上使用。
    “ 小贴士: 代理继承可通过如下组合来进行替代:
    ⚫ 父模型中的一个 many-to-one 字段
    ⚫ 重载 create()方法自动创建并设置父级记录
    ⚫ 父字段中希望暴露的特定字段的关联字段
    有时这比完整的代理继承更为合适。例如 res.company 并没有继承 res.partner,但使用到了其中
    好几个字段。 ”
    不要忘记在 library_member/model/__init__.py 文件中加入:
    from . import library_book
    from . import library_member
    要使用我们创建的 Member 模型,还要完成以下步骤:
    ⚫ 添加安全权限控制列表(ACL)
    ⚫ 添加菜单项
    ⚫ 添加表单和列表视图
    ⚫ 更新 manifest 文件来声明这些新增数据文件
    读者可以先尝试自己添加,再来看下面的详细步骤:
    要创建安全 ACL,创建 library_member/security/ir.model.access.csv 文件并加入如下代码:
    id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
    access_member_user,Member User
    Access,model_library_member,library_app.library_group_user,1,1,1,0
    access_member_manager,Member Manager
    Access,model_library_member,library_app.library_group_manager,1,1,1,1
    要添加菜单项, 创建 library_member/views/library_menu.xml 文件并加入如下代码:

    <odoo>
    <act_window id="action_library_member"
    name="Library Members"
    res_model="library.member"
    view_mode="tree,form" />

    <menuitem id="menu_library_member"
    action="action_library_member"
    parent="library_app.menu_library" />
    </odoo>

    要添加视图,创建 library_member/views/member_view.xml 文件并加入如下代码:

    <?xml version="1.0" ?>
    <odoo>
    <record id="view_form_member" model="ir.ui.view">
    <field name="name">Library Member Form View</field>
    <field name="model">library.member</field>
    <field name="arch" type="xml">
    <form>
    <group>
    <field name="name" />
    <field name="email" />
    <field name="card_number" />
    </group>
    </form>
    </field>
    </record>
    <record id="view_tree_member" model="ir.ui.view">
    <field name="name">Library Member List View</field>
    <field name="model">library.member</field>
    <field name="arch" type="xml">
    <form>
    <group>
    <field name="name" />
    <field name="card_number" />
    </group>
    </form>
    </field>
    </record>
    <record id="view_tree_member" model="ir.ui.view">
    <field name="name">Library Member List View</field>
    <field name="model">library.member</field>
    <field name="arch" type="xml">
    <form>
    <group>
    <field name="name" />
    <field name="card_number" />
    </group>
    </form>
    </field>
    </record> </odoo>

    最后,编辑 manifest 文件来声明这三个新文件:
    'data':[
    ...
    'security/ir.model.access.csv',
    'views/library_menu.xml',
    'views/member_view.xml',
    ]
    如果编写正确,在进行模型更新后即可使用新的图书会员模型了。
    ~/odoo-dev/odoo/odoo-bin -d dev12 -u library_member

    更多教程:https://www.erpdaxue.cn/odoo/odoo-teach/

  • 相关阅读:
    计数和查找
    遍历
    top小火箭
    leetcode 字符串中的第一个唯一字符
    leetcode 颠倒整数
    leetcode 反转字符串
    leetcode 有效的数独
    leetcode 两数之和
    leetcode 移动零
    leetcode 加一
  • 原文地址:https://www.cnblogs.com/odoo14/p/12952848.html
Copyright © 2011-2022 走看看