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

FANDX 發表於 2021-07-21

今天繼續研究ORM的BaseModel,昨天研究了一下所有常用屬性的具體用法,那麼今天研究一下BaseModel中一些常用的方法,我們學會它們並靈活的應用它們,可以為我們開發解決很多的問題。

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

增 - create方法
@api.model_create_multi
@api.returns('self', lambda value: value.id)
def create(self, vals_list):
  # vals_list是一個列表資料,迴圈根據列表資料的內容建立資料,返回資料物件。
  """
	    ....
    """

重寫create方法可以實現我們想要的在建立前後做一些自己想要做的工作。

刪 - unlink方法
def unlink(self):
  # self是需要刪除資料的物件。
  """
  	....
  """

重寫unlink的方法,可以在刪除資料的前後可以做一些自己的工作。

改 - write方法
def write(self, vals):
  # self是需要修改資料的物件。
  # vals是一個字典資料,key是需要修改的欄位的名稱,value是修改之後的值。
  """
  	....
  """

重寫write的方法可以實現在對指定資料欄位修改的時候的前後做出自己的動作。

查 - 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, 分頁資料,多少號資料開始。
  # limit, 數量量,offset和limit一起可以用來資料分頁操作。
  # count, 如果count=True,只會返回search到的資料的數量。
  """
  ....
  """

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

總結
  • 其實重寫這4個方法,在odoo的建立的時候肯定可以解決90%以上的問題。
  • 重點注意的就是api.mode的裝飾器使用,如果基礎方法使用了裝飾器,那麼重寫的時候也一定要加上裝飾器。

Odoo ORM Search家族

一個幫助odoo實現資料查詢的家族

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

  • browse(self, ids=None)
    • 查詢指定ids的資料。
    • 這裡ids是一個列表,其實就是資料庫資料的主鍵id資料的列表。
    • 返回:records物件集。
  • search(self, args, offset=0, limit=None, order=None, count=False)
    • 根據指定條件查詢資料。
    • 上面有詳細的用法。
    • 返回:records物件集。
  • search_count(self, args)
    • 查詢資料個數。
    • args就是domain過濾方法。
    • 返回:int型別數量。
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    • 獲取資料的display_name集合。
    • 配合name_get使用,可以修改xml呼叫display_name的具體顯示。
    • 返回:列表資料 [(id, displayname)...]。
  • name_get(self)
    • 根據self的物件內容返回 [(id, name), ...]
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    • 在資料分組的時候會使用,如果資料分組的時候需要做操作可以改寫這個方法。
    • 返回:列表中巢狀字典的資料。

其他物件查詢方法

  • read(self, fields=None, load='_classic_read')
    • 可以根據self的物件序列化資料返回。
    • fields, 一個列表資料,將要序列化的資料欄位給寫進入,預設是所有。
    • 返回:一個序列化資料 [{'欄位名稱': "欄位值", ...}....]。
  • filtered(self, func)
    • 根據func的內容,進行對records物件進行過濾 列:lambda r: not r.id
    • 返回:records物件列表。
  • filtered_domain(self, domain)
    • 在records物件列表的基礎之上進行再次過濾。
    • 返回:一個新的records的物件列表。
  • fields_get(self, allfields=None, attributes=None)
    • 獲取field的具體內容描述,如果想在python field將欄位readonly=True,重寫這個方法就可以實現。

Odoo ORM Create家族

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

  • create(self, vals_list)
    • 建立資料庫資料,這裡上上面已經詳細講解過了,這裡就不做詳細解釋了。
  • name_create(self, name)
    • 通過_rec_name來建立record物件。
    • 呼叫create的方法,根據傳參name的值到_rec_name進行建立資料。
    • 返回:name_get()的值或者False。
  • new(self, values={}, origin=None, ref=None)
    • 建立新的虛擬資料的方法。
    • 這個方法不會寫入到資料庫中,只會在快取中建立資料。

其他create的的方法

  • copy(self, default=None)
    • copy資料,建立新的一條新的資料。
    • 返回一條新的recode。

Odoo ORM Write家族

  • update(self, values):
    • 更新資料values也是key value的方式一樣。
  • write(self, vals)
    • 更新資料到資料庫,update其實最後還是呼叫了write的方法進行更新資料。

Odoo ORM Unlink家族

  • unlink(self)
    • 刪除資料,在上面也有詳細講解。

其他方法可能會用到

  • ensure_one(self)
    • 判斷資料是否為只有一個,只要不是一個那麼就會丟擲異常。
  • exists(self)
    • 判斷這個self物件是否存在。
  • view_init(self, fields_list)
    • 新建form檢視的時候會走到這個方法。
  • load(self, fields, data)
    • 載入資料矩陣,匯入資料的時候會載入這個方法。
  • default_get(self, fields_list)
    • 獲取default的值。
    • 在建立form資料的時候會呼叫這個方法。
    • 這裡還會呼叫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)
    • 控制檢視的展示樣式。
    • 這個方法重寫可以根據自己的需求在程式碼中修改一些檢視的資訊。
    • 返回一個字典資料來控制檢視。
  • get_formview_id(self, access_uid=None)
    • 根據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物件的內容。
  • flush(self, fnames=None, records=None)
    • 重新整理資料,更新資料庫的資料。
  • refresh(self):
    • 刪除快取資料。
  • recompute(self, fnames=None, records=None):
    • 重新計算指定欄位的資料。
  • onchange(self, values, field_name, field_onchange)
    • 資料改動的時候觸發的方法。