Odoo ORM研究2 – BaseModel中的常用方法分析
今天繼續研究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對象列表。
- 根據func的內容,進行對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)
- 數據改動的時候觸發的方法。