* 全局的引用
    所有的的模型定义外,都在注册中心注册了,我们可以用全局变量来引用这些模型
    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>

(08)odoo继承机制的更多相关文章

  1. Javascript 构造函数原型继承机制

    我们先聊聊Js的历史,1994年Netscape公司发布了Navigator浏览器0.9班.这是历史上第一个比较成熟的网络浏览器.轰动一时.但是,这个版本的浏览器只能用来浏览,不具备交互功能,最主要的 ...

  2. javascript继承机制的设计思想(ryf)

    我一直很难理解Javascript语言的继承机制. 它没有"子类"和"父类"的概念,也没有"类"(class)和"实例" ...

  3. javascript 之 prototype继承机制

    理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例&qu ...

  4. Javascript类继承-机制-代码Demo【原创】

    最近看到<Javascript设计模式>,对js模拟的”继承方式“有了更深一步的了解,虽然之前也总是用到prototype.new ,但只是知其然不知所以然,现在将类继承的方法整理如下,暂 ...

  5. 创建对象的最好方式&最好的继承机制(代码实例)

    /* 创建对象的最好方式:混合的构造函数/原型方式, *用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法) */ function People(sname){ this.nam ...

  6. js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法。

    js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } Class ...

  7. 【JavaScript】重温Javascript继承机制

    上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Ja ...

  8. Unity3d - 初学篇 Event Functions 的 继承 机制

    我们知道Start() Update() 等之类的 事件函数 在Unity 主线程中是依次调用的.至于调用的顺序可以查手册. 由此继承机制也会发生一些改变. 测试一: public class MyT ...

  9. Java面向对象程序设计--与C++对比说明:系列3(Java 继承机制)

    继承(inheritance)背后的核心思想是:       bonus = b;    }      } Java没有像C++那样提供多继承机制,但提供了接口机制,在后面我们将详细探究接口机制的实现 ...

随机推荐

  1. 【leetcode❤python】409. Longest Palindrome

    #-*- coding: UTF-8 -*- from collections import Counterclass Solution(object):    def longestPalindro ...

  2. 12.Generics

    benifit: 1.make developers extremely productive is code reuse, which is the ability to derive a clas ...

  3. [SAP ABAP开发技术总结]面向对象OO

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  4. CUBRID学习笔记 24 数据类型1

    ---恢复内容开始--- 一 数字类型  注意小数的四舍五入问题 1数字型 Type Bytes Mix Max Exact/approx. SHORTSMALLINT 2 -32,768 32,76 ...

  5. python计算文件的行数和读取某一行内容的实现方法

    一.计算文件的行数 最简单的办法是把文件读入一个大的列表中,然后统计列表的长度.如果文件的路径是以参数的形式filepath传递的,那么只用一行代码就可以完成我们的需求了:count = len(op ...

  6. [转]十款提高开发效率的PHP编码工具

    1 . PHPUnit 测试在软件开发中是相当重要的一环,但很多开发者都只是给予很少的时间去测试,因为这工作的确相当耗时,枯燥并且容易出错.为了解决以上问题,自动化测试工具能让开发者编写一系列测试脚本 ...

  7. RelativeLayout用到的一些重要的属性:

    下面是常用的一些属性 RelativeLayout用到的一些重要的属性: 第一类:属性值为true或falseandroid:layout_centerHrizontal 水平居中android:la ...

  8. iOS - OC RunLoop 运行循环/消息循环

    1.RunLoop 1)运行循环: 运行循环在 iOS 开发中几乎不用,但是概念的理解却非常重要. 同一个方法中的代码一般都在同一个运行循环中执行,运行循环监听 UI 界面的修改事件,待本次运行循环结 ...

  9. Javascript中日期函数的相关操作

    Date对象具有多种构造函数,下面简单列举如下: new Date() new Date(milliseconds) new Date(datestring) new Date(year, month ...

  10. Linux系统/etc/init.d目录

    理解Linux系统/etc/init.d目录和/etc/rc.local脚本 http://blog.csdn.net/acs713/article/details/7322082 Linux文件目录 ...