(36)老版和新版API调用

时间:2021-07-21 23:27:24

---------
更新时间
18:06 2016-09-18 星期日
-------

*前言
   我用的是odoo8,但里面有相当多的api是以前版本,这时若我们自己开发的
   插件采用新版本api,里面又要调用旧版本api.如何操作
   个人建议自己扩展功能尽量采用新版本api
  
* 版本api对比
     from openerp.osv import fields, osv
    
     class MyModel(osv.osv):
        pass...
    -------------   
    class MyModel(osv.Model):
        pass...   
    -------------------
     新版
    from openerp import api, fields, models    
   
    class MyModel(models.Model):
        pass...
       
    模型则定义的api版本,跟在后面的字段定义和方法定义
    也就要相应的写法,这里不要混写了

* 新旧版方法
   def compute(self, cr, uid, from_currency_id, to_currency_id, from_amount,
                round=True, context=None):   
       pass...
    ---------------
    新版
   def onchange_currency_custom(self):   
      pass...
     
   很明显看到新版少了self,cr,uid context

* 新旧版调用
  这个主要区分在获取模型的方法
   旧版:self.pool['模型名']  或 self.pool.get('模型名')
   新版:self.env['模型名']  或 self.env.get('模型名') 
  
  举一例:
  旧版
  currency_obj = self.pool['res.currency']
  v = currency_obj.compute(self.env.cr, self.env.uid, currency_id, acc.company_id.currency_id.id, amount, context=context)
  ------
  新版
  account_obj = self.env['account.account']
  acc = account_obj.browse(account_id)
 
  ------
  只有你采用旧版获取模型方法,才可以调用旧版模型中定义的方法
  若定义方法用了@api.v7 和@api.v8定义兼容方法,这时调用时就可随便一些
  也是因为官方有太多老版,才在这里讲解,否则有些同仁一直会为参数不匹配烦恼。
 
* 新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.model
    @api.model
    def some_method(self, a_value):
        pass
    # can be called as
    old_style_model.some_method(cr, uid, a_value, context=context)
    # 没用用ids
   
* @api.multi
    @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)
    #和@api.model 就是相差,带了ids列表,但可以看到这是一个可选项
   
* @api.returns('self')
  假定返回值为记录集
   >>> @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]