odoo10 繼承(擴展)、模塊數據

一:繼承

在不改變底層對象的時候添加新的功能——這是通過繼承機制來實現的,作為在現有對象之上的修改層,這些修改可以發生在所有級別:模型,視圖和業務邏輯。不是直接修改現有模塊,而是創建一個新模塊以添加預期的修改。

1:擴展模型

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

?添加字段:

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

修改現有字段:

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

添加方法:

添加新方法很簡單:只需在繼承類中聲明新的函數。

修改方法:

擴展或更改現有邏輯,可以通過聲明具有完全相同名稱的方法來覆蓋相應的方法

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

?擴展模型的幾種方式:

1)類繼承:擴展類中沒有_name屬性,因為它繼承了父類的_name。對現有模型的擴展, 添加新功能,都將添加到現有模型中,不會創建新模型。?因此,在odoo中,根據_name唯一確定這個模型時找到的就是擴展后的類。(如上面添加字段是類繼承)

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

復制意味著被繼承的方法和字段也將在繼承模型中可用。 對于字段,這意味著它們也將被創建并存儲在目標模型的數據庫表中。 原始(繼承)和新(繼承)模型的數據記錄保持不相關。 只有定義是共享的。

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

優點是不需要在幾個表之間重復數據結構,例如地址。 任何需要包含地址的新模型都可以將其委派給嵌入式合作伙伴模型。 如果在合作伙伴地址字段中引入了修改,則這些修改會立即提供給嵌入它的所有模型!

?

2:擴展視圖

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

對于XML,在其中定位元素的最好方法是使用XPath表達式。如果XPath表達式匹配到多個元素,只有第一個元素會被修改。 因此,表達式應該使用獨特的屬性以使其指定盡可能具體。 使用name屬性是確保我們找到擴展點的確切xml元素的最簡單方法。 因此,在我們的視圖XML元素上定義name屬性是很重要的。

Xpath表達式的格式:expr="//標簽名[@屬性]='屬性值'":找到屬性=屬性值的標簽位置。

下面是一個寫在arch中的實現在is_done字段之前添加date_deadline字段的具體例子:

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

Odoo為此提供了快捷符號,因此大多數時候我們可以完全避免XPath語法。 我們僅使用要定位的元素的特定屬性及定位類型相關信息就可以了。

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

如果字段在同一視圖中多次出現,則應始終使用XPath語法

position屬性是可選的:

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

1)擴展表單視圖

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

2)擴展列表視圖

<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中進行擴展<field name="定位標簽名" position="擴展位置"> <field ....進行擴展 /></field></field></record>

3)擴展搜索視圖

<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"> //下面進行定位、擴展舉例<field name="name" position="after"><filter name="filter_my_tasks" string="My Tasks" domain="[('user_id','in',[uid,False])]" /></field> </field></record> 

?4)修改記錄

對于記錄:

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

數據記錄加載時,實際上對模型y執行了create或update操作︰ 如果記錄x不存在,則創建它; 否則,更新原來對應的值。?

修改菜單項:

< ! — — 修改菜單項-->
<record id="菜單視圖id" model="ir.ui.menu">//進行修改
</record>

修改action_window

<record model="ir.actions.act_window"id="action菜單id">//進行修改
</record>

二:模塊數據

1:列表數據的導出

數據導出是tree視圖的標準功能,不涉及編碼。

只需在列表視圖左側復選框勾選需要導出的記錄,然后點擊列表上方“動作”下拉列表,選擇“導出”。

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

2:導入數據

在面板點擊“導入”按鈕,選擇文件后載入。然后點擊“驗證”,檢查文件內容的格式合法性,如果正常,則點擊“導入”即可。

3:模塊數據

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

一個附加的限制是文件名必須與要加載數據的模型的名稱匹配,這樣系統才可以推斷應該將數據導入相應的模型。

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

4:演示數據

一個模塊在安裝時,盡量事先定義一些演示數據,方便在安裝后進行測試使用。

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

然后在manifest文件中的data屬性進行配置。

5:XML

?noupdate:重復數據加載時,將重寫上次運行中加載的記錄。 這意味著升級一個模塊將覆蓋在數據庫內可能已經進行的任何手動更改。此重新導入行為是默認值,但可以更改,以便在升級模塊時,某些數據文件記錄保持不變。 這是通過<odoo>或元素的noupdate =“1”屬性完成的。 這些記錄將在安裝addon模塊時創建,但在后續模塊升級中不會對其進行任何操作

XML中定義記錄:

每個<record>元素有兩個基本屬性id和model,并且包含為每列分配值的<field>元素。如前所述,id屬性對應于記錄的外部標識符,并且模型屬性對應于要寫入記錄的目標模型

設置字段值的幾種方式如下:

1:<record>元素定義數據記錄并包含<field>元素以設置每個字段的值,field元素的name屬性標識要寫入的字段,要寫入的值是元素內容:字段的開始和結束標記之間的文本。

2:定義字段值的更精細的替代方法是eval屬性:它評估一個Python表達式并將結果值分配給字段。

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

3:<field>元素還有一個ref屬性,用于使用外部標識符設置many-to-one字段的值。

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

XML中觸發函數:

可以通過<function>元素,在其加載過程中執行方法。這可以用來建立演示和測試數據。

<functionmodel="數據模型"name="數據模型中的方法"eval="參數" />

另一方式是觸發工作流:

<workflow model="模型"
ref="工作流實例"
action="工作流信號:觸發工作流" />

?

轉載于:https://www.cnblogs.com/soleZ/p/10076040.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/387800.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/387800.shtml
英文地址,請注明出處:http://en.pswp.cn/news/387800.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

做一個vue的todolist列表

<template><div id"app"><input type"text" v-model"todo" ref"ip"/><button click"add()">新增</button><br/><br/><hr/><ul><li v-for"(item,key) in li…

hadoop+hive-0.10.0完全分布式安裝方法

hadoophive-0.10.0完全分布式安裝方法 1、jdk版本&#xff1a;jdk-7u60-linux-x64.tar.gz http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.html 2、hive版本&#xff1a;hive-0.10.0.tar.gz https://archive.apache.org/dist/hive/hive-0…

關于gitgithub的操作

先馬克&#xff0c;回頭細看&#xff0c;然后整理一下 https://linux.cn/article-4292-1.html轉載于:https://www.cnblogs.com/mengjie1001/p/10076530.html

一種解決 MacBook 里的 App Store 無法登錄的問題

剛剛買回來的 2018 款帶有 touchbar 的 MacBook Pro 15 inc 在用 App Store 安裝 app 時一直無法登錄成功&#xff08;網絡鏈接都是好的&#xff09;&#xff0c;導致軟件都無法更新&#xff0c;折騰了挺一會的。 后來發現是要退出設置里的 iCloud 登錄&#xff0c;然后重新登錄…

第二次沖刺

1、今日各個成員的問題 組員問題張晉誌對mui的API看得不是很懂&#xff0c;無法順利的使用袁慶杰基礎不牢,編寫困難周建峰eclipse沒法創建web項目&#xff0c;按照網上的方法&#xff0c;check for updates 和 install new software 之后也沒用許家燁給單一功能知道如何實現但項…

牌類游戲使用微服務重構筆記(八): 游戲網關服務器

網關服務器 所謂網關&#xff0c;其實就是維持玩家客戶端的連接&#xff0c;將玩家發的游戲請求轉發到具體后端服務的服務器&#xff0c;具有以下幾個功能點&#xff1a; 長期運行&#xff0c;必須具有較高的穩定性和性能對外開放&#xff0c;即客戶端需要知道網關的IP和端口&a…

配置獨立于系統的PYTHON環境

配置獨立于系統的PYTHON環境 python 當前用戶包 一種解決方案是在利用本機的python環境的基礎上&#xff0c;將python的包安裝在當前user的.local文件夾下 一共有兩種方式來實現pip的時候安裝到當前user 設置pip配置文件 pip.conf 一種是在~/.pip文件夾下的pip配置文件pip.conf…

好程序員技術教程分享JavaScript運動框架

好程序員技術教程分享JavaScript運動框架&#xff0c;有需要的朋友可以參考下。 JavaScript的運動&#xff0c;即讓某元素的某些屬性由一個值變到另一個值的過程。如讓div的width屬性由200px變到400px&#xff0c;opacity屬性由0.3變到1.0&#xff0c;就是一個運動過程。 實現運…

linux 下mysql等php的安裝 lnmp

訪問https://lnmp.org/install.html按照步驟安裝 當下載執行完 wget -c http://soft.vpser.net/lnmp/lnmp1.3.tar.gz && tar zxf lnmp1.3.tar.gz && cd lnmp1.3 && ./install.shlnmp 要到.install.sh下改一下下載地址&#xff0c;把http直接更換成…

單純形法

單純形法 如果目標函數中所有系數都非正&#xff0c;那么顯然這些變量直接取0是最優的&#xff0c;所以此時答案為即為常數項。 我們要做的就是通過轉化把目標函數的系數全部搞成非負。 思路就是用非基變量替換基變量。 先找到一個目標函數中系數為正的變量&#xff0c;在所有限…

洛谷P1828 香甜的黃油 Sweet Butter

香甜的黃油 Sweet Butter 黃油真的是這么做的嗎&#xff1f;&#xff01;&#xff01;&#xff01;[惶恐] 這道題是Dijkstra算法的簡單變形 通過題意我們要找到一個點使奶牛所在點的路程和最短。通過Dijkstra的模板我們可以求的一點到其他任一點的最短路徑&#xff0c;那么我們…

JAVA List集合轉Page(分頁對象)

/*** version 1.0* author: fwjia*/ import java.util.List;public class PageModel<T> {/**** 當前頁*/private int page 1;/**** 總頁數*/public int totalPages 0;/**** 每頁數據條數*/private int pageRecorders;/**** 總頁數*/private int totalRows 0;/**** 每頁…

分區分表實驗用的語句

--查看索引 select * from DBA_IND_PARTITIONS &#xff54;; select status,t.* from dba_indexes t where t.OWNERGANSUSC; select count(*) from ACT_HI_VARINST SELECT ALTER INDEX || TABLE_OWNER || . || INDEX_NAME || UNUSABLE; UNUSABLE_INDEX FROM ALL_INDEX…

分布式數據庫數據一致性的原理、與技術實現方案

http://youzhixueyuan.com/the-principle-and-technology-realization-of-distributed-data-consistency.html 背景 可用性&#xff08;Availability&#xff09;和一致性&#xff08;Consistency&#xff09;是分布式系統的基本問題&#xff0c;先有著名的CAP理論定義過分布式…

模塊之re模塊 —— 正則

#‘match’只匹配從左向右第一個值是否在中括號的范圍內&#xff0c;如果沒有就返回None 如果有就直接打印一個對象&#xff0c;加上.group()就可以返回你要找的區間里面的值&#xff0c;如果沒有找到對應的值&#xff0c;加上‘.group()’會報錯 #‘search’ 默認是從整個st…

centos7 docker

Docker 是一個開源工具&#xff0c;它可以讓創建和管理 Linux 容器變得簡單。容器就像是輕量級的虛擬機&#xff0c;并且可以以毫秒級的速度來啟動或停止。Docker 幫助系統管理員和程序員在容器中開發應用程序&#xff0c;并且可以擴展到成千上萬的節點。 容器和 VM&#xff08…

批處理ping指定ip列表

for /f in (filename) do (command) for /f %i in (C:\ip.txt) do (ping %i -n 1 && echo %i 通 >>IP.txt || echo %i 不通 >>IP1.txt) 有返回寫入ip.txt 沒有寫入ip1.txt轉載于:https://blog.51cto.com/2216859/2384188

Intellij Idea 2017創建web項目及tomcat部署實戰

相關軟件&#xff1a;Intellij Idea2017、jdk16、tomcat7 Intellij Idea直接安裝&#xff08;可根據需要選擇自己設置的安裝目錄&#xff09;&#xff0c;jdk使用1.6/1.7/1.8都可以&#xff0c;主要是配置好系統環境變量&#xff0c;tomcat7上tomcat的官網下載壓縮包解壓即可。…

docker ssh

1&#xff0c;首先&#xff0c;需要從Docker官網獲得centos或Ubuntu鏡像 2&#xff0c;當本地已有Ubuntu鏡像后&#xff08;大概200M左右大小&#xff09;&#xff0c;使用如下命令 [cpp]view plaincopy docker run -t -i ubuntu /bin/bash 即可啟動一個容器&#xff0c;并放…

[BFS]JZOJ 4672 Graph Coloring

Description 現在你有一張無向圖包含n個節點m條邊。最初&#xff0c;每一條邊都是藍色或者紅色。每一次你可以將一個節點連接的所有邊變色&#xff08;從紅變藍&#xff0c;藍變紅&#xff09;。找到一種步數最小的方案&#xff0c;使得所有邊的顏色相同。Input 第一行包含兩個…