(08)odoo继承机制

原文链接: https://my.oschina.net/toby2chen/blog/611318

* 全局的引用
    所有的的模型定义外,都在注册中心注册了,我们可以用全局变量来引用这些模型
    self.env[mode name] 比如得到合作伙伴这个模型 self.evn['res.partner']
    
* 三种常用继承 (在model中操作)
    _inherit 没重定义_name  这样数据库不会新建对象表,用被继承的表
    _inherit 重定义_name 这样数据库会创建新的对象表存储
    _inherits 是复合继承,有模型对象,有字段对象
    
    示例:
    
    class MyModelExtended(Model):
     _inherit = 'a.model'                       # direct heritage
     _inherit = ['a.model, 'a.other.model']     # direct heritage
     _inherits = {'a.model': 'field_name'}      # polymorphic heritage
  
* 增加field
    from openerp import models,fields,api

    class TodoTask(models.Model)
         _inherit = 'todo.task'
         
         user_id = fields.Many2one('res.users',string='Response')
         date_deadline = fields.Date('Deadline')   

* 修改已有的field
    name = fields.Char(help="can I help you")     
    这样额外增加了help帮助信息
  
* 重载原模型的方法
    super(TodoTask,self)  两个参数 一个是具体父类的类名和 self
    
    @api.multi
    def do_clear_done(self):
        domain = [(’is_done’, ’=’, True),
        ’|’, (’user_id’, ’=’, ’self.env.uid’),
        (’user_id’,’=’,False)]
        done_recs = self.search(domain)
        done_recs.write({’active’:False})
    return True    
    
    @api.one
    def do_toggle_done(self):
        if self.user_id != self.env.user:
            raise Exception(’Only the responsible can do this!’)
        else:
            return super(TodoTask, self).do_toggle_done()
    
    要某该记录的 user_id 等于当前用户的 id self.env.uid ,要某 user_id 值为 False    
    @api.multi 告诉我们这个函数里面的self是一个recordset        
    @api.one 自动遍历目标 recordset,然后方法里面的 self 就是一个 record。
    
* recordset操作
    record in recset1 # 包含
    record not in recset1 # 不包含
    recset1 + recset2 # 两个相加分前后顺序
    recset1 | recset2 # 两个并集
    recset1 & recset2 # 两个交集
    recset1 - recset2 # difference  两个差集
    recset.copy() # copy the recordset (not a deep copy) 浅拷贝
    
    如:
     for record in recordset:
        print(record)
    
* domain语法
  最基本的语句  [('field_name','operator',value)]
    field_name 必须目标模型的有效field名字
    operator 有 = != > >= < <= like ilike
                not in, parent_left,  child_of, parent_right
    value 必须和前面的 field_name类型相同的某个值
    基本的语句 可以用逻辑运算符连接,默认的符号是 &
    
    [(’field_name1’, ’operator’, value), ’!’,
        (’field_name2’, ’operator’, value), ’|’,
        (’field_name3’, ’operator’, value),(’field_name4’, ’operator’, value)]
    
    ! 只作用于后面一个元素 , &和| 作用于后面两个元素
    上面解析为:
     1 表达式  and 2表达式否 and  3表达式 或 4表达式
     
* recordset 的search方法
    返回得是一个 recordset
    self.env[model_name].search(domain表达式)
    
* 视图的继承
   
   
       
           
            Todo Task form – User extension
            todo.task
           
           
               
                   
               

               
                   
               

               
                    I have to...
               

           

           

       

   

    
    定义继承
    
    定位 path语法  //field[@name]=''
   
     
   
    
     插入点有  inside 插入到定位标签之内
               before 插入到定位标签之前
               after 插入到定位标签之后
               replace 替换定位标签,若是空内容,就是删除原标签元素
               
    原视图属性更改
   
        I am going to
   
    
               
   
        1
   

    隐藏标签,这个常用,不建议前面说的删除标签

* 多态继承
   _inherit 可以继承多个模型
   
   _name='todo.task'
   _inherit = ['todo.task','mail.thread']
   
   
* 修改其它数据文件
    不能像视图文件下的arch结构下的xml 可以用 XPath表达式

    # 删除记录
               ref(’todo_app.todo_task_user_rule’))]” />
         
    # 更新数据
      
       
            ToDo Tasks only for owner
           
           
           
                [’|’,(’user_id’,’in’, [user.id,False]),
                (’message_follower_ids’,’in’,[user.partner_id.id])]
           

        

作者:陈伟明 | 联系 : QQ 942923305 | 微信 toby942923305 | E-mail: [email protected]


转载于:https://my.oschina.net/toby2chen/blog/611318

你可能感兴趣的:((08)odoo继承机制)