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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章