(17)odoo方法和修饰器

---------------------
更新时间:
11:06 2016-09-27 星期二
18:06 2016-09-18 星期日
10:31 2016-03-01 星期二
---------------------
* 方法和修饰器
    api是命名修饰器,识别 cr,cursor, uid, user, user_id, id, ids, context
   
    # @api.returns
      返回指定模型的记录集
        @api.returns('res.partner')
        def afun(self):
            ...
            return x  # a RecordSet
           
        这样就返回合作伙伴记录集
          当老的方式进行调用,会自动返回成 ids 列表,而不是记录集
       
    # @api.one
      返回当前记录,指明下面self是一条记录
        @api.one
        def afun(self):
            self.name = 'toto'
           自动循环记录集,给出记录给你操作,但不支持button的action对
           应的方法,是要用@api.multi 和 self.ensure_one() 来代替
           
    # @api.multi
       返回记录集,指明下面的self是记录集
        @api.multi
        def afun(self):
            len(self)
           
    # @api.model
       保证兼容版本,指明下面的self是模型对象
        @api.model
        def afun(self):
            pass
           
    # @api.constrains
        保证关系时的约束
        @api.one
        @api.constrains('name', 'description')
        def _check_description(self):
            if self.name == self.description:
                raise ValidationError("Fields name and description must be different")
       
    # @api.depends
        @api.one
        @api.depends('partner_id.name', 'partner_id.is_company')
        def _compute_pname(self):
            if self.partner_id.is_company:
                self.pname = (self.partner_id.name or "").upper()
            else:
                self.pname = self.partner_id.name
          指定依赖,只要指定的字段发生变化,对应的会用方法重新计算
           
           
    # @api.onchange
        监控字段的变化,然后操作响应
        @api.onchange('fieldx')
        def do_stuff(self): #就这个特别self 是记录,不是记录集
           if self.fieldx == x:
              self.fieldy = 'toto'
        只支持简单字段
            和@api.depends 最大的不同是,它在表单里面改变数据时,对应的字段
            发生改变,但只会把结果暂放在缓存中,没会直接改变到数据库,只有提交
            了表单过后,才会改变数据表中的数据         

原文地址:https://www.cnblogs.com/toby2chen/p/5177145.html