36 老版和新版API呼叫

2022-05-23 07:51:07 字數 2735 閱讀 7504

---------

更新時間

18:06 2016-09-18 星期日

-------

*前言我用的是odoo8,但裡面有相當多的api是以前版本,這時若我們自己開發的

外掛程式採用新版本api,裡面又要呼叫舊版本api.如何操作

個人建議自己擴充套件功能盡量採用新版本api

* 版本api對比

from openerp.osv import fields, osv

class mymodel(osv.osv):

pass...

-------------   

class mymodel(osv.model):

pass...   

-------------------

新版from openerp import api, fields, models    

class mymodel(models.model):

pass...

模型則定義的api版本,跟在後面的字段定義和方法定義

也就要相應的寫法,這裡不要混寫了

* 新舊版方法

def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount,

round=true, context=none):   

pass...

---------------

新版def onchange_currency_custom(self):   

pass...

很明顯看到新版少了self,cr,uid context

* 新舊版呼叫

這個主要區分在獲取模型的方法

舊版:self.pool['模型名']  或 self.pool.get('模型名')

新版:self.env['模型名']  或 self.env.get('模型名') 

舉一例:

舊版currency_obj = self.pool['res.currency']

v = currency_obj.compute(self.env.cr, self.env.uid, currency_id, acc.company_id.currency_id.id, amount, context=context)

------

新版account_obj = self.env['account.account']

acc = account_obj.browse(account_id)

------

只有你採用舊版獲取模型方法,才可以呼叫舊版模型中定義的方法

若定義方法用了@api.v7 和@api.v8定義相容方法,這時呼叫時就可隨便一些

也是因為官方有太多老版,才在這裡講解,否則有些同仁一直會為引數不匹配煩惱。

* 新api呼叫舊api橋梁

>>> # method in the old api style

>>> def old_method(self, cr, uid, ids, context=none):

...    print ids

>>> # method in the new api style

>>> def new_method(self):

...     # system automatically infers how to call the old-style

...     # method from the new-style method

...     self.old_method()

>>> env[model].browse([1, 2, 3, 4]).new_method()

[1, 2, 3, 4]

* @api.model

@api.model

def some_method(self, a_value):

pass

# can be called as

old_style_model.some_method(cr, uid, a_value, context=context)

# 沒用用ids

* @api.multi

@api.multi

def some_method(self, a_value):

pass

# can be called as

old_style_model.some_method(cr, uid, [id1, id2], a_value, context=context)

#和@api.model 就是相差,帶了ids列表,但可以看到這是乙個可選項

* @api.returns('self')

假定返回值為記錄集

>>> @api.multi

... @api.returns('self')

... def some_method(self):

...     return self

>>> new_style_model = env['a.model'].browse(1, 2, 3)

>>> new_style_model.some_method()

a.model(1, 2, 3)

>>> old_style_model = pool['a.model']

>>> old_style_model.some_method(cr, uid, [1, 2, 3], context=context)

[1, 2, 3] 

CSS3彈性盒模型新版和老版寫法差異

1 在使用彈性盒模型的時候父元素必須要加display box 或 display inline box 新版彈性盒模型 flex display flex 老版彈性盒模型 box display webkit box 2 box orient 定義盒模型的主軸方向 新版 flex flex dir...

CSS3彈性盒模型新版和老版寫法差異

1 在使用彈性盒模型的時候父元素必須要加display box 或 display inline box 新版彈性盒模型 flex display flex 老版彈性盒模型 box display webkit box 2 box orient 定義盒模型的主軸方向 新版 flex flex dir...

PHP實現人人OAuth登入和API呼叫

人人開放平台給出的php sdk,個人感覺寫的不怎麼樣,而且在我的電腦上執行不出來,總是113錯誤,查文件竟然還沒有這個錯誤碼,於是只好自己按照官方給出的文件,用php自己實現了一下。如下文,沒有作封裝,只是走了一下流程。如果是僅僅用於人人連線這樣的登入驗證和簡單的api呼叫,也不是很有必要封裝。作...