Odoo v10 API与Odoo v8 API

时间:2017-03-05 22:15:49

标签: python openerp odoo-8 odoo-10

我只是想知道,如何将某些功能转换为新的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。

1 个答案:

答案 0 :(得分:2)

正如你自己写的那样

  

该方法暴露为不使用id,其记录集通常为空。

在odoo ORM上下文中,

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

仅针对此主题,可以认为将旧方法“翻译”到新API非常容易。如果您在方法参数中看到idsid<model>_id(s),则可能是api.multiapi.one。如果你没有em:api.model。例外是compute,onchange和constraint方法。