• (36)老版和新版API调用


    ---------
    更新时间
    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] 

  • 相关阅读:
    40 图 |我用 Mac M1 玩转 Spring Cloud
    # 20 图 |6000 字 |实战缓存(上篇)
    博客园,你肿么了?
    ES 终于可以搜到”悟空哥“了!
    48 张图 | 手摸手教你微服务的性能监控、压测和调优
    植树节,种个二叉树吧?
    紫霞仙子:区块链的十二连问
    太上老君的炼丹炉之分布式 Quorum NWR
    病毒入侵:全靠分布式
    为什么要“除夕”,原来是内存爆了
  • 原文地址:https://www.cnblogs.com/toby2chen/p/5603239.html
Copyright © 2020-2023  润新知