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]

猜你喜欢

转载自blog.csdn.net/sinat_23931991/article/details/84997986
API
今日推荐