Odoo ORM研究2 - BaseModel中的常用方法分析

今天繼續(xù)研究ORM的BaseModel,昨天研究了一下所有常用屬性的具體用法,那么今天研究一下BaseModel中一些常用的方法禾乘,我們學會它們并靈活的應用它們,可以為我們開發(fā)解決很多的問題虽缕。

odoo ORM的4大將 - 增刪改查(非常重要)

增 - create方法
@api.model_create_multi
@api.returns('self', lambda value: value.id)
def create(self, vals_list):
  # vals_list是一個列表數(shù)據(jù)始藕,循環(huán)根據(jù)列表數(shù)據(jù)的內(nèi)容創(chuàng)建數(shù)據(jù),返回數(shù)據(jù)對象。
  """
        ....
    """

重寫create方法可以實現(xiàn)我們想要的在創(chuàng)建前后做一些自己想要做的工作伍派。

刪 - unlink方法
def unlink(self):
  # self是需要刪除數(shù)據(jù)的對象江耀。
  """
    ....
  """

重寫unlink的方法,可以在刪除數(shù)據(jù)的前后可以做一些自己的工作诉植。

改 - write方法
def write(self, vals):
  # self是需要修改數(shù)據(jù)的對象祥国。
  # vals是一個字典數(shù)據(jù),key是需要修改的字段的名稱晾腔,value是修改之后的值舌稀。
  """
    ....
  """

重寫write的方法可以實現(xiàn)在對指定數(shù)據(jù)字段修改的時候的前后做出自己的動作。

查 - search方法
@api.model
@api.returns('self',
        upgrade=lambda self, value, args, offset=0, limit=None, order=None, count=False: value if count else self.browse(value),
        downgrade=lambda self, value, args, offset=0, limit=None, order=None, count=False: value if count else value.ids)
def search(self, args, offset=0, limit=None, order=None, count=False):
  # agrs, 其實就是domain過濾條件灼擂。
  # offset, 分頁數(shù)據(jù)壁查,多少號數(shù)據(jù)開始。
  # limit, 數(shù)量量剔应,offset和limit一起可以用來數(shù)據(jù)分頁操作睡腿。
  # count, 如果count=True,只會返回search到的數(shù)據(jù)的數(shù)量峻贮。
  """
  ....
  """

重寫search()方法可以做到自由的在查詢的時候做一些自己的操作嫉到。

總結(jié)
  • 其實重寫這4個方法,在odoo的創(chuàng)建的時候肯定可以解決90%以上的問題月洛。
  • 重點注意的就是api.mode的裝飾器使用何恶,如果基礎(chǔ)方法使用了裝飾器,那么重寫的時候也一定要加上裝飾器嚼黔。

Odoo ORM Search家族

一個幫助odoo實現(xiàn)數(shù)據(jù)查詢的家族

這個家族主要成員(常用的方法)

  • browse(self, ids=None)
    • 查詢指定ids的數(shù)據(jù)细层。
    • 這里ids是一個列表,其實就是數(shù)據(jù)庫數(shù)據(jù)的主鍵id數(shù)據(jù)的列表唬涧。
    • 返回:records對象集疫赎。
  • search(self, args, offset=0, limit=None, order=None, count=False)
    • 根據(jù)指定條件查詢數(shù)據(jù)。
    • 上面有詳細的用法碎节。
    • 返回:records對象集捧搞。
  • search_count(self, args)
    • 查詢數(shù)據(jù)個數(shù)。
    • args就是domain過濾方法狮荔。
    • 返回:int類型數(shù)量胎撇。
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    • 獲取數(shù)據(jù)的display_name集合。
    • 配合name_get使用殖氏,可以修改xml調(diào)用display_name的具體顯示晚树。
    • 返回:列表數(shù)據(jù) [(id, displayname)...]。
  • name_get(self)
    • 根據(jù)self的對象內(nèi)容返回 [(id, name), ...]
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    • 在數(shù)據(jù)分組的時候會使用雅采,如果數(shù)據(jù)分組的時候需要做操作可以改寫這個方法爵憎。
    • 返回:列表中嵌套字典的數(shù)據(jù)慨亲。

其他對象查詢方法

  • read(self, fields=None, load='_classic_read')
    • 可以根據(jù)self的對象序列化數(shù)據(jù)返回。
    • fields, 一個列表數(shù)據(jù)宝鼓,將要序列化的數(shù)據(jù)字段給寫進入刑棵,默認是所有。
    • 返回:一個序列化數(shù)據(jù) [{'字段名稱': "字段值", ...}....]愚铡。
  • filtered(self, func)
    • 根據(jù)func的內(nèi)容铐望,進行對records對象進行過濾 列:lambda r: not r.id
    • 返回:records對象列表茂附。
  • filtered_domain(self, domain)
    • 在records對象列表的基礎(chǔ)之上進行再次過濾正蛙。
    • 返回:一個新的records的對象列表。
  • fields_get(self, allfields=None, attributes=None)
    • 獲取field的具體內(nèi)容描述营曼,如果想在python field將字段readonly=True乒验,重寫這個方法就可以實現(xiàn)。

Odoo ORM Create家族

主要家族成員(常用方法)

  • create(self, vals_list)
    • 創(chuàng)建數(shù)據(jù)庫數(shù)據(jù)蒂阱,這里上上面已經(jīng)詳細講解過了锻全,這里就不做詳細解釋了。
  • name_create(self, name)
    • 通過_rec_name來創(chuàng)建record對象录煤。
    • 調(diào)用create的方法鳄厌,根據(jù)傳參name的值到_rec_name進行創(chuàng)建數(shù)據(jù)。
    • 返回:name_get()的值或者False妈踊。
  • new(self, values={}, origin=None, ref=None)
    • 創(chuàng)建新的虛擬數(shù)據(jù)的方法了嚎。
    • 這個方法不會寫入到數(shù)據(jù)庫中,只會在緩存中創(chuàng)建數(shù)據(jù)廊营。

其他create的的方法

  • copy(self, default=None)
    • copy數(shù)據(jù)歪泳,創(chuàng)建新的一條新的數(shù)據(jù)。
    • 返回一條新的recode露筒。

Odoo ORM Write家族

  • update(self, values):
    • 更新數(shù)據(jù)values也是key value的方式一樣呐伞。
  • write(self, vals)
    • 更新數(shù)據(jù)到數(shù)據(jù)庫,update其實最后還是調(diào)用了write的方法進行更新數(shù)據(jù)慎式。

Odoo ORM Unlink家族

  • unlink(self)
    • 刪除數(shù)據(jù)伶氢,在上面也有詳細講解。

其他方法可能會用到

  • ensure_one(self)
    • 判斷數(shù)據(jù)是否為只有一個瘪吏,只要不是一個那么就會拋出異常癣防。
  • exists(self)
    • 判斷這個self對象是否存在。
  • view_init(self, fields_list)
    • 新建form視圖的時候會走到這個方法肪虎。
  • load(self, fields, data)
    • 加載數(shù)據(jù)矩陣劣砍,導入數(shù)據(jù)的時候會加載這個方法惧蛹。
  • default_get(self, fields_list)
    • 獲取default的值扇救。
    • 在創(chuàng)建form數(shù)據(jù)的時候會調(diào)用這個方法刑枝。
    • 這里還會調(diào)用view_init()的方法。
  • user_has_groups(self, groups)
    • 判斷當前用戶是否擁有指定groups組迅腔,返回True或False装畅。
  • load_views(self, views, options=None)
    • 加載視圖,通過傳參views沧烈。
    • 配合_context可以針對不同的頁面顯示自己想要的視圖掠兄。
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    • 控制視圖的展示樣式。
    • 這個方法重寫可以根據(jù)自己的需求在代碼中修改一些視圖的信息锌雀。
    • 返回一個字典數(shù)據(jù)來控制視圖蚂夕。
  • get_formview_id(self, access_uid=None)
    • 根據(jù)record對象獲取form視圖的id。
  • get_formview_action(self, access_uid=None)
    • 獲取form視圖的action動作腋逆,用來渲染視圖婿牍。
  • clear_caches(cls)
    • 清除緩存。
  • with_env(self, env)
    • 給自己的record的對象添加新的env惩歉。
  • sudo(self, flag=True)
    • 以superuser的方式返回對象等脂。
  • with_user(self, user)
    • 以指定新的用戶返回對象。
  • with_context(self, *args, **kwargs):
    • 給record的對象添加新的上下文撑蚌。
  • sorted(self, key=None, reverse=False)
    • 按id進行排序record對象的內(nèi)容上遥。
  • flush(self, fnames=None, records=None)
    • 刷新數(shù)據(jù),更新數(shù)據(jù)庫的數(shù)據(jù)争涌。
  • refresh(self):
    • 刪除緩存數(shù)據(jù)粉楚。
  • recompute(self, fnames=None, records=None):
    • 重新計算指定字段的數(shù)據(jù)。
  • onchange(self, values, field_name, field_onchange)
    • 數(shù)據(jù)改動的時候觸發(fā)的方法亮垫。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末解幼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子包警,更是在濱河造成了極大的恐慌撵摆,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件害晦,死亡現(xiàn)場離奇詭異特铝,居然都是意外死亡,警方通過查閱死者的電腦和手機壹瘟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門鲫剿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人稻轨,你說我怎么就攤上這事灵莲。” “怎么了殴俱?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵政冻,是天一觀的道長枚抵。 經(jīng)常有香客問我,道長明场,這世上最難降的妖魔是什么汽摹? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮苦锨,結(jié)果婚禮上逼泣,老公的妹妹穿的比我還像新娘。我一直安慰自己舟舒,他們只是感情好拉庶,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著秃励,像睡著了一般砍的。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上莺治,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天廓鞠,我揣著相機與錄音,去河邊找鬼谣旁。 笑死床佳,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的榄审。 我是一名探鬼主播砌们,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼搁进!你這毒婦竟也來了浪感?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤饼问,失蹤者是張志新(化名)和其女友劉穎影兽,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體莱革,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡峻堰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了盅视。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片捐名。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖闹击,靈堂內(nèi)的尸體忽然破棺而出镶蹋,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布贺归,位于F島的核電站淆两,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牧氮。R本人自食惡果不足惜琼腔,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一瑰枫、第九天 我趴在偏房一處隱蔽的房頂上張望踱葛。 院中可真熱鬧,春花似錦光坝、人聲如沸尸诽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽性含。三九已至,卻和暖如春鸳惯,著一層夾襖步出監(jiān)牢的瞬間商蕴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工芝发, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绪商,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓辅鲸,卻偏偏與公主長得像格郁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子独悴,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • Odoo的模型有三種基類: Model:用于常規(guī)的數(shù)據(jù)庫持久化模型TransientModel:用于存儲在數(shù)據(jù)庫中...
    覺釋閱讀 4,146評論 0 2
  • 介紹 二開時模型創(chuàng)建完畢并配好視圖后對于基本的CRUD操作不需要再在代碼中實現(xiàn)刻炒,框架會自動提供這些功能决采,但如果我們...
    胡傳偉1994閱讀 5,011評論 0 9
  • 記錄集 model的數(shù)據(jù)是通過數(shù)據(jù)集合的形式來使用的,定義在model里的函數(shù)執(zhí)行時它們的self變量也是一個數(shù)據(jù)...
    XiaoHaiYang閱讀 16,866評論 0 16
  • 創(chuàng)建第一個odoo 應用 Odoo遵循傳統(tǒng)的MVC模式坟奥。我們可以通過創(chuàng)建簡單的To-Do 應用來具體介紹分析 mo...
    F4A3閱讀 1,440評論 0 5
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月织狐,有人笑有人哭,有人歡樂有人憂愁筏勒,有人驚喜有人失落移迫,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,523評論 28 53