Odoo v10 API 与 Odoo v8 API

Odoo v10 API vs Odoo v8 API

我只是想知道,一些函数如何翻译成新的 API,或者是否需要完全翻译它们,这取决于我们使用的 api 调用。

例如,

@api.model

the method is exposed as not using ids, its recordset will generally be empty. Its "old API" signature is 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)

在 Odoo v8 上,假设我有这样的功能:

def update_info(self, cr, uid, ids, context=None):
    """ OpenERP osv memory wizard : update_info_partner
    """
    context = context or {}
    seniat_url_obj = self.env('seniat.url')
    self.cr.execute('''SELECT id FROM res_partner WHERE vat ilike 'VE%';''')
    record = self.cr.fetchall()
    pids = [item[0] for item in record]
    seniat_url_obj.connect_seniat(cr, uid, pids, context=context,
                                  all_rif=True)
    return{}

如果我给这个函数添加@api.model装饰器,我想我还需要更新它的属性,即:self, cr, uid, ids, context=None,对吗?

在这种情况下,添加 @api.model 装饰器然后将函数属性更改为仅 self?

就足够了

我只是想知道如何解决这个问题,从现在开始,因为我正在将一些模块从 v8 迁移到 v10。

如你所写

the method is exposed as not using ids, its recordset will generally be empty.

api.model 在 odoo ORM 上下文中更像是一个静态方法。对于 python 本身,它当然不是静态方法。如果您正在处理记录(数据库记录作为 python 对象),请使用 api.multiapi.one。如果您根本没有记录,例如 ORM create(),请使用 api.model.

"Translating"旧方法新API可以说是很简单了,仅供本题。如果您在方法参数中看到 idsid 或者 <model>_id(s),则可能是 api.multiapi.one。如果你没有 em:api.model。计算、onchange 和约束方法除外。