(08)odoo继承机制

* 全局的引用
所有的的模型定义外,都在注册中心注册了,我们可以用全局变量来引用这些模型
self.env[mode name] 比如得到合作伙伴这个模型 self.evn[‘res.partner‘]

* 增加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>

时间: 2024-12-20 23:56:14

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

javascript继承机制 &amp; call apply使用说明

一.继承机制 1.对象冒充:构造函数使用 this 关键字给所有属性和方法赋值,可使 ClassA 构造函数成为 ClassB 的方法,然后调用它. function ClassZ() { this.newMethod = ClassX; this.newMethod(); delete this.newMethod; this.newMethod = ClassY; this.newMethod(); delete this.newMethod; } 这里存在一个弊端,如果存在两个类 Clas

javascript 之 prototype继承机制

理解Javascript语言的继承机制 javascript没有"子类"和"父类"的概念,也没有"类"(class)和"实例"(instance)的区分,全靠一种很奇特的"原型链"(prototype chain)模式,来实现继承. 1.引言 1994年,网景公司急需一种网页脚本语言,使得浏览器可以与网页互动.工程师Brendan Eich 负责开发这种新语言.他觉得,没必要设计得很复杂,这种语言只要能够完

重温Javascript继承机制

原文:http://mozilla.com.cn/post/21667/ =========================== 上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Javascript原名Mocha,当时还叫做LiveScript,创造者是Brendan Eich,现任Mozilla公司首席技术官. 1994年,历史上第一个比较成熟的网

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

我们知道Start() Update() 等之类的 事件函数 在Unity 主线程中是依次调用的.至于调用的顺序可以查手册. 由此继承机制也会发生一些改变. 测试一: public class MyTest2 : MonoBehaviour { void Start () { //EventDelegate.Add(tween.onFinished, Test, true); Debug.Log(" MyTest2 Start "); } void Update() { Debug.L

【JavaScript】重温Javascript继承机制

上段时间,团队内部有过好几次给力的分享,这里对西风师傅分享的继承机制稍作整理一下,适当加了些口语化的描述,留作备案. 一.讲个故事吧 澄清在先,Java和Javascript是雷锋和雷峰塔的关系.Javascript原名Mocha,当时还叫做LiveScript,创造者是Brendan Eich,现任Mozilla公司首席技术官. 1994年,历史上第一个比较成熟的网络浏览器——Navigator0.9版诞生在网景公司(Netscape),极为轰动.但是,Navigator0.9只能用来浏览,不

类的构建和继承机制(c++)

构建类: 抽象:将同类事物的共同属性和行为提取出来并将其用变量和函数表达出来: 封装:将抽象得来的变量和函数捆绑在一起形成一个完整的类(即这类事物拥有了属性和行为) 控制访问权限: private: 除了在该类中可以直接访问到之外,外界以及派生类均不能直接访问其成员: protected: 在该类和其派生类中可以直接访问到其成员,外界不能直接访问到: public: 除了在该类和其派生类中可以直接访问到其成员,外界也能直接访问: 如下创建一个类: 构造出学生类之后,便可以创建学生对象: Stud

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

js最好的继承机制:用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. function ClassA(sColor) { this.color = sColor; } ClassA.prototype.sayColor = function () { alert(this.color); }; function ClassB(sColor, sName) {//在 ClassB 构造函数中,用对象冒充继承 ClassA 类的 sColor 属性 ClassA.call(th

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

/* 创建对象的最好方式:混合的构造函数/原型方式, *用构造函数定义对象的所有非函数属性,用原型方式定义对象的函数属性(方法) */ function People(sname){ this.name = sname; } People.prototype.sayName = function(){ console.log(this.name); } /* 最好的继承机制: * 用对象冒充继承构造函数的属性,用原型prototype继承对象的方法. */ function Student(sn

JavaScript大杂烩4 - 理解JavaScript对象的继承机制

面向对象之继承 JavaScript是单根的面向对象语言,它只有单一的根Object,所有的其他对象都是直接或者间接的从Object对象继承(没有指定父类的对象,都被认为是从Object继承的). 在前面我们讨论了面向对象的封装性,在最后的地方也谈到了JavaScript的继承是通过原型和原型链实现的,下面我们就详细的展开这个问题:JavaScript到底是如何实现继承的? 继承的本质 继承的本质是重用,从语法上来讲,继承就是"D是B"的描述,其中B是基类,描述共性,D是子类,描述特性