1. 程式人生 > >Odoo12 ORM API ☞ Compatibility between new API and old API

Odoo12 ORM API ☞ Compatibility between new API and old API

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]