今天繼續(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對象列表茂附。
- 根據(jù)func的內(nèi)容铐望,進行對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ā)的方法亮垫。