日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

odoo10 继承(扩展)、模块数据

發(fā)布時(shí)間:2023/11/30 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 odoo10 继承(扩展)、模块数据 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一:繼承

在不改變底層對(duì)象的時(shí)候添加新的功能——這是通過(guò)繼承機(jī)制來(lái)實(shí)現(xiàn)的,作為在現(xiàn)有對(duì)象之上的修改層,這些修改可以發(fā)生在所有級(jí)別:模型,視圖和業(yè)務(wù)邏輯。不是直接修改現(xiàn)有模塊,而是創(chuàng)建一個(gè)新模塊以添加預(yù)期的修改。

1:擴(kuò)展模型

Odoo?模型存在 Python 的模塊之外, 在中間注冊(cè)表那里。對(duì)于這個(gè)注冊(cè)表,可以通過(guò)模型的方法使用self.env[<model name>]進(jìn)入。 例如, 通過(guò)res.partner 模型獲取對(duì)象的引用, 代碼書寫如下 self.env['res.partner']。

?添加字段:

# -*- coding: utf-8 -*- from odoo import models, fields, api class Sub(models.Model): _inherit = 'Root' //通過(guò)_inherit屬性來(lái)繼承父模型 newCol=fields.XX.... //在下面添加新字段即可。

修改現(xiàn)有字段:

為了改變現(xiàn)有字段的屬性,只需再次定義該字段,需要修改的屬性顯式重寫即可,會(huì)保留未修改的所有其他未在此處明確使用的字段的屬性。

添加方法:

添加新方法很簡(jiǎn)單:只需在繼承類中聲明新的函數(shù)。

修改方法:

擴(kuò)展或更改現(xiàn)有邏輯,可以通過(guò)聲明具有完全相同名稱的方法來(lái)覆蓋相應(yīng)的方法

新方法將替換前一個(gè)方法,它可以只是擴(kuò)展繼承類的代碼,使用Python的super()方法來(lái)調(diào)用父方法。然后,可以在調(diào)用super()方法之前和之后,在原有邏輯周圍添加新邏輯。

?擴(kuò)展模型的幾種方式:

1)類繼承:擴(kuò)展類中沒有_name屬性,因?yàn)樗^承了父類的_name。對(duì)現(xiàn)有模型的擴(kuò)展, 添加新功能,都將添加到現(xiàn)有模型中,不會(huì)創(chuàng)建新模型。?因此,在odoo中,根據(jù)_name唯一確定這個(gè)模型時(shí)找到的就是擴(kuò)展后的類。(如上面添加字段是類繼承)

2)原型繼承:我們想使用具有不同于父模型的值的_name屬性,我們將獲得一個(gè)新模型重用來(lái)自繼承的特性,但是具有自己的數(shù)據(jù)庫(kù)表和數(shù)據(jù)。其實(shí)就是把繼承的類的功能特性拷貝衣服給新的模型使用,并不改變被繼承模型。

復(fù)制意味著被繼承的方法和字段也將在繼承模型中可用。 對(duì)于字段,這意味著它們也將被創(chuàng)建并存儲(chǔ)在目標(biāo)模型的數(shù)據(jù)庫(kù)表中。 原始(繼承)和新(繼承)模型的數(shù)據(jù)記錄保持不相關(guān)。 只有定義是共享的。

3)代理繼承(委托繼承):使用_inherits屬性,它允許一個(gè)模型以透明的方式包含其他模型。通過(guò)字典映射繼承模型與字段的關(guān)系,并關(guān)聯(lián)它們。(相當(dāng)于成員變量:引用一個(gè)外部的類對(duì)象賦值給這個(gè)模型的一個(gè)成員,但是對(duì)象的值是保存在被引用的類的數(shù)據(jù)庫(kù)表中的。但是在當(dāng)前類通過(guò)成員修改了變量值的,則會(huì)同步到被引用的類的數(shù)據(jù)庫(kù)表中)

優(yōu)點(diǎn)是不需要在幾個(gè)表之間重復(fù)數(shù)據(jù)結(jié)構(gòu),例如地址。 任何需要包含地址的新模型都可以將其委派給嵌入式合作伙伴模型。 如果在合作伙伴地址字段中引入了修改,則這些修改會(huì)立即提供給嵌入它的所有模型!

?

2:擴(kuò)展視圖

表單,列表和搜索視圖是使用arch XML結(jié)構(gòu)定義的。 要擴(kuò)展視圖,我們需要一種方法來(lái)修改這個(gè)XML。 這意味著需要定位XML中的元素位置,然后在這些位置引入修改。

對(duì)于XML,在其中定位元素的最好方法是使用XPath表達(dá)式。如果XPath表達(dá)式匹配到多個(gè)元素,只有第一個(gè)元素會(huì)被修改。 因此,表達(dá)式應(yīng)該使用獨(dú)特的屬性以使其指定盡可能具體。 使用name屬性是確保我們找到擴(kuò)展點(diǎn)的確切xml元素的最簡(jiǎn)單方法。 因此,在我們的視圖XML元素上定義name屬性是很重要的。

Xpath表達(dá)式的格式:expr="//標(biāo)簽名[@屬性]='屬性值'":找到屬性=屬性值的標(biāo)簽位置。

下面是一個(gè)寫在arch中的實(shí)現(xiàn)在is_done字段之前添加date_deadline字段的具體例子:

<xpath expr="//field[@name]='is_done'" position="before"> //expr屬性值的意思是:找到<filed name="is_done"/>的標(biāo)簽<field name="date_deadline" /> </xpath>

Odoo為此提供了快捷符號(hào),因此大多數(shù)時(shí)候我們可以完全避免XPath語(yǔ)法。 我們僅使用要定位的元素的特定屬性及定位類型相關(guān)信息就可以了。

<field name="is_done" position="before"><field name="date_deadline" /></field>

如果字段在同一視圖中多次出現(xiàn),則應(yīng)始終使用XPath語(yǔ)法

position屬性是可選的:

after:將內(nèi)容添加到父元素之中,匹配的節(jié)點(diǎn)之后。 before:添加內(nèi)容在匹配節(jié)點(diǎn)之前。 inside(默認(rèn)值):匹配節(jié)點(diǎn)內(nèi)的追加內(nèi)容。 replace:替換匹配的節(jié)點(diǎn)。如果使用空內(nèi)容,它將刪除該匹配的元素。 attributes:修改匹配元素的XML屬性。在元素內(nèi)容使用<attribute name =“attr-name”>實(shí)現(xiàn)給屬性name設(shè)置新屬性值attr-name。

1)擴(kuò)展表單視圖

<record id="view_form_模塊名_inherited" model="ir.ui.view"><field name="name">模塊名_extension</field><field name="model">模塊.數(shù)據(jù)模型</field><field name="inherit_id" ref="模塊_模型.被繼承的form表單name屬性"/><field name="arch" type="xml"> //在arch中進(jìn)行擴(kuò)展操作:定位—>插入/修改<field name="定位標(biāo)簽位置" position="在標(biāo)簽的哪里進(jìn)行擴(kuò)展"><field ......> //擴(kuò)展內(nèi)容</field></field> </record>

2)擴(kuò)展列表視圖

<record id="view_tree_模型名_inherited" model="ir.ui.view"><field name="name">模型名 extension</field><field name="model">模塊.模型</field><field name="inherit_id" ref="被繼承的tree視圖name名"/><field name="arch" type="xml">//在arch中進(jìn)行擴(kuò)展<field name="定位標(biāo)簽名" position="擴(kuò)展位置"> <field ....進(jìn)行擴(kuò)展 /></field></field></record>

3)擴(kuò)展搜索視圖

<record id="view_filter_模型名_inherited" model="ir.ui.view"><field name="name"> extension</field><field name="model">模型名</field><field name="inherit_id" ref="被繼承的filter視圖名"/><field name="arch" type="xml"> //下面進(jìn)行定位、擴(kuò)展舉例<field name="name" position="after"><filter name="filter_my_tasks" string="My Tasks" domain="[('user_id','in',[uid,False])]" /></field> </field></record>

?4)修改記錄

對(duì)于記錄:

<record id="x" model="y">

數(shù)據(jù)記錄加載時(shí),實(shí)際上對(duì)模型y執(zhí)行了create或update操作︰ 如果記錄x不存在,則創(chuàng)建它; 否則,更新原來(lái)對(duì)應(yīng)的值。?

修改菜單項(xiàng):

< ! — — 修改菜單項(xiàng)--> <record id="菜單視圖id" model="ir.ui.menu">//進(jìn)行修改 </record>

修改action_window

<record model="ir.actions.act_window"id="action菜單id">//進(jìn)行修改 </record>

二:模塊數(shù)據(jù)

1:列表數(shù)據(jù)的導(dǎo)出

數(shù)據(jù)導(dǎo)出是tree視圖的標(biāo)準(zhǔn)功能,不涉及編碼。

只需在列表視圖左側(cè)復(fù)選框勾選需要導(dǎo)出的記錄,然后點(diǎn)擊列表上方“動(dòng)作”下拉列表,選擇“導(dǎo)出”。

在導(dǎo)出對(duì)話框中選擇需要導(dǎo)出的列、導(dǎo)出的格式(一般選擇CSV,勾選 導(dǎo)入兼容導(dǎo)出),然后點(diǎn)擊“導(dǎo)出到文件”即可。

2:導(dǎo)入數(shù)據(jù)

在面板點(diǎn)擊“導(dǎo)入”按鈕,選擇文件后載入。然后點(diǎn)擊“驗(yàn)證”,檢查文件內(nèi)容的格式合法性,如果正常,則點(diǎn)擊“導(dǎo)入”即可。

3:模塊數(shù)據(jù)

模塊使用數(shù)據(jù)文件,將其配置加載到數(shù)據(jù)庫(kù),可以通過(guò)CSV和XML文件完成。為了完整性,也可以使用YAML文件格式,但是它很少用于加載數(shù)據(jù)。

一個(gè)附加的限制是文件名必須與要加載數(shù)據(jù)的模型的名稱匹配,這樣系統(tǒng)才可以推斷應(yīng)該將數(shù)據(jù)導(dǎo)入相應(yīng)的模型。

數(shù)據(jù)CSV文件的常見用法是加載到ir.model.access模型中的安全定義。

4:演示數(shù)據(jù)

一個(gè)模塊在安裝時(shí),盡量事先定義一些演示數(shù)據(jù),方便在安裝后進(jìn)行測(cè)試使用。

演示數(shù)據(jù)我們放在data目錄下,命名為 xx.xx.csv或者xx.xx.xml

然后在manifest文件中的data屬性進(jìn)行配置。

5:XML

?noupdate:重復(fù)數(shù)據(jù)加載時(shí),將重寫上次運(yùn)行中加載的記錄。 這意味著升級(jí)一個(gè)模塊將覆蓋在數(shù)據(jù)庫(kù)內(nèi)可能已經(jīng)進(jìn)行的任何手動(dòng)更改。此重新導(dǎo)入行為是默認(rèn)值,但可以更改,以便在升級(jí)模塊時(shí),某些數(shù)據(jù)文件記錄保持不變。 這是通過(guò)<odoo>或元素的noupdate =“1”屬性完成的。 這些記錄將在安裝addon模塊時(shí)創(chuàng)建,但在后續(xù)模塊升級(jí)中不會(huì)對(duì)其進(jìn)行任何操作

XML中定義記錄:

每個(gè)<record>元素有兩個(gè)基本屬性id和model,并且包含為每列分配值的<field>元素。如前所述,id屬性對(duì)應(yīng)于記錄的外部標(biāo)識(shí)符,并且模型屬性對(duì)應(yīng)于要寫入記錄的目標(biāo)模型

設(shè)置字段值的幾種方式如下:

1:<record>元素定義數(shù)據(jù)記錄并包含<field>元素以設(shè)置每個(gè)字段的值,field元素的name屬性標(biāo)識(shí)要寫入的字段,要寫入的值是元素內(nèi)容:字段的開始和結(jié)束標(biāo)記之間的文本。

2:定義字段值的更精細(xì)的替代方法是eval屬性:它評(píng)估一個(gè)Python表達(dá)式并將結(jié)果值分配給字段。

<field name="date_deadline"eval="(datetime.now() + timedelta(-1)).strftime('%Y-%m-%d')" />

3:<field>元素還有一個(gè)ref屬性,用于使用外部標(biāo)識(shí)符設(shè)置many-to-one字段的值。

<field name="user_id" ref="base.user_demo" />

XML中觸發(fā)函數(shù):

可以通過(guò)<function>元素,在其加載過(guò)程中執(zhí)行方法。這可以用來(lái)建立演示和測(cè)試數(shù)據(jù)。

<functionmodel="數(shù)據(jù)模型"name="數(shù)據(jù)模型中的方法"eval="參數(shù)" />

另一方式是觸發(fā)工作流:

<workflow model="模型" ref="工作流實(shí)例" action="工作流信號(hào):觸發(fā)工作流" />

?

轉(zhuǎn)載于:https://www.cnblogs.com/soleZ/p/10076040.html

總結(jié)

以上是生活随笔為你收集整理的odoo10 继承(扩展)、模块数据的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。