【關於odoo新API的介紹,Internet上資料很少,或者不夠完整詳實,這會對初學者造成很大的困惑,本篇的目的就是希望能幫助新手了解新API的大概】
odoo 新api的實現是借助於python裝飾器,關於python裝飾器的知識,請自行參考python相關手冊。
新API的裝飾器主要有以下幾種:
model,multi,one
constrains,depends,onchange,returns
還有一些像
cr,cr_context,cr_uid,cr_uid_context,cr_uid_id,cr_uid_id_contet,cr_uid_ids,cr_uid_ids_context
這些主要用於一些特定的方法。
一、one
one的用法主要用於self為單一集合的情況,與之相對應的是multi。被one裝飾的方法會返回一個list(某些誤人子弟的教程說one不返回值的,實際是返回了[None]),對於v7版本中類似於 def funct(self,cr,uid,ids,context)的方法可以用api.one裝飾器改用v8寫法。
例子:
二、multi
與one相對應,one要求self是單一記錄,而multi則要求self是多個記錄的合集。
三、model
model要求self是一個記錄集,env中並不包含ids參數,即適用於v7中類似於 def funct(self,cr,uid,args,context)的方法。
四、contrains
已經在上篇文章中介紹過,略過不講。
五、depends
depends 主要用於compute方法,v8當中已經取消了function字段,對於任何fields都可以通過添加compute屬性動態賦值。depends就是用來標該方法依賴於哪些字段的裝飾。
例如我們讓學員你的年齡等於學員的編號+1(非常扯淡的邏輯,只做演示):
事實上,不一定非要使用depends裝飾,去掉depends裝飾后,以上的代碼仍然work,只不過運行的時機有了改變,這是為什么呢?請各位同學看官自行體會。
插曲:我們知道7.0中function字段是默認不存儲的,需要使用store參數進行存儲。v8當中所有帶有compute參數的字段默認都不會存儲,store參數也變成了boolean類型,不再提供store的觸發函數。這里使用depends的字段就相當於v7當中的trigger,當依賴的字段發生改變時,會觸發這里的函數對數據庫進行更新。但如果depends依賴的字段也沒有存儲,那么依舊不會觸發。
對於存儲的目的是用來搜索的童鞋來說,我們提供另外一種實現方式,將在后續的文章中提到,敬請期待。
六、onchange
onchange的使用方法非常簡單,就是當字段發生改變時,觸發綁定的函數。
七、returns
returns的用法主要是用來指定返回值的格式,它接受三個參數,第一個為返回值的model,第二個為向下兼容的method,第三個為向上兼容的method
第一個參數如果是對象本身,以'self',如果是其他對象,則寫其他對象名如:@api.returns('ir.ui.view')
例子:
注意看第二個例子,如果調用該方法的是一個v7版本的方法,返回值將進行向下兼容的轉化,即通過第二個參數的lamda表達式返回該記錄的id。
總結:
本文只對常見的幾種API進行了詳細的介紹,更多內容請關注本博客(http://www.cnblogs.com/kfx2007/)的其他文章。