Odoo12 ORM API ☞ Compatibility between new API and old API
阿新 • • 發佈:2018-12-25
Compatibility between new API and old API(新舊API之間的相容性)
Odoo目前正在從較舊的(較不常規)API轉換,有時可能需要手動的將一個API手動轉換到另一個API:
- RPC層(XML-RPC和JSON-RPC)都是用舊API表示的,在新API中表示的方法不能通過只通過RPC獲得。
- 重寫的方法可以被舊API樣式編寫的舊程式碼片段呼叫。
舊API和新API之間的最大差異是:
- 環境( Environment )的值(cursor,user id和context)顯式傳遞給方法。
- 記錄資料(ids)顯式傳遞給方法,可能根本不傳遞。
- 方法往往適用於ID列表而不是記錄集。
預設情況下,方法使用新API呼叫,並且不能從舊的API樣式呼叫。
當使用新API呼叫舊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中有兩種裝飾器可以直接被舊API直接呼叫。
model()
model裝飾器方法呼叫(is exposed )時不使用id,其記錄集通常為空。它的“舊API”預設方法引數(signature 簽名)是cr,uid,* arguments,context:
@api.model
def some_method(self, a_value):
pass
# can be called as
old_style_model.some_method(cr, uid, a_value, context=context)
multi()
multi裝飾方法呼叫(is exposed )時使用獲取ID列表(可能為空),它的“舊API”預設方法引數(signature 簽名)是cr,uid,ids, * arguments,context:
@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)
需要注意的是 create 方法使用 model() 裝飾時,通常被呼叫時使用一個單字典作為引數。
當 create 方法被 model_create_multi() 裝飾時,通常被呼叫時是通過一個字典列表作為引數。
裝飾器則負責將引數轉換為一種形式或另一種形式:
@api.model
def create(self, vals):
...
@api.model_create_multi
def create(self, vals_list):
...
由於新API傾向於返回記錄集,而舊式API傾向於返回id列表,所以還有一個裝飾器管理返回值:
returns()
函式被認定返回一個記錄集,第一個引數應該是***model***(記錄集模型)或 self 的名稱(對於當前模型)。
當被新API呼叫時方法返回值不受影響,當被舊API呼叫時會將返回值記錄集轉換為ids(id列表):
>>> @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]