• (08)odoo继承机制


    * 全局的引用
        所有的的模型定义外,都在注册中心注册了,我们可以用全局变量来引用这些模型
        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表达式)
       
    * 视图的继承
        <?xml version=”1.0”?>
        <openerp>
            <data>
                <record id=”view_form_todo_task_inherited” model=”ir.ui.view”>
                <field name=”name”>Todo Task form – User extension</field>
                <field name=”model”>todo.task</field>
                <field name=”inherit_id” ref=”todo_app.view_form_todo_task”/>
                <field name=”arch” type=”xml”>
                    <field name=”name” position=”after”>
                        <field name=”user_id” />
                    </field>
                    <field name=”is_done” position=”before”>
                        <field name=”date_deadline” />
                    </field>
                    <field name=”name” position=”attributes”>
                        <attribute name=”string”>I have to...</attribute>
                    </field>
                </field>
                </record>
            </data>
        </openerp>
       
        <field name=”inherit_id” ref=”todo_app.view_form_todo_task”/> 定义继承
       
        定位 path语法  //field[@name]=''
        <field name=”name” position=”after”>
          <field name=”user_id” />
        </field>   
         插入点有  inside 插入到定位标签之内
                   before 插入到定位标签之前
                   after 插入到定位标签之后
                   replace 替换定位标签,若是空内容,就是删除原标签元素
                  
        原视图属性更改
        <field name=”name” position=”attributes”>
            <attribute name=”string”>I am going to</attribute>
        </field>   
                  
        <field name=”active” position=”attributes”>
            <attribute name=”invisible”>1</attribute>
        </field>
        隐藏标签,这个常用,不建议前面说的删除标签

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

        # 删除记录
          <delete model=”ir.rule” search=”[(’id’, ’=’,
             ref(’todo_app.todo_task_user_rule’))]” />
            
        # 更新数据
           <record id=”x” model=”y”>
            <record id=”todo_task_per_user_rule” model=”ir.rule”>
                <field name=”name”>ToDo Tasks only for owner</field>
                <field name=”model_id” ref=”model_todo_task”/>
                <field name=”groups” eval=”[(4, ref(’base.group_user’))]”/>
                <field name=”domain_force”>
                    [’|’,(’user_id’,’in’, [user.id,False]),
                    (’message_follower_ids’,’in’,[user.partner_id.id])]
                </field>
             </record>

  • 相关阅读:
    速查快递
    浅谈C#中常见的委托<Func,Action,Predicate>(转)
    C#用扩展方法进行自动生成添加删除对象转换的功能
    sql字符串分组
    PowerDesigner连接SQL Server
    老程序员的下场(转)
    界面设计:一个像素之差产生的距离(转)
    程序员如何活得明白(转)
    真实死锁案例记录
    分享java常用技术教程:dubbo、zookeeper、ActiveMq、多线程、Redis、PowerDesigner等
  • 原文地址:https://www.cnblogs.com/toby2chen/p/5177103.html
Copyright © 2020-2023  润新知