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/

posted @ 2020-05-24 21:41  十年老猿  阅读(511)  评论(0编辑  收藏  举报