odoo 模型继承
在odoo中有两种模型的继承机制(传统方式和委托继承方式)
重点:在__manifest__.py中找到depends,加上要继承的模块
'depends': ['account']
- 注意继承的模型所在addon需要在本addon里添加依赖,不然会报一个TypeError: Model 'xxx' does not exist in registry 错误。
传统方式
- 能够添加字段 改写字段定义 添加约束 添加或改写方法共有两种写法 1 类继承 2 原型继承
类继承
_name = 'event.registration'
_inherit = 'event.registration'
_name和_inherit的模型名一致,都为'event.registration', 此时_name可以省略不写。
类继承不会创建新的模型,能够直接修改模型定义,新加的字段会在原表中添加,数据库中没有新的表生成。
例子
class model_1(models.Model):
_name = 'activity.registration'
class model_2(models.Model):
_inherit = 'event.registration'
event_id = fields.Many2one(
'activity.event', string='Event', required=True,
readonly=True, states={'draft': [('readonly', False)]})
原型继承
_name = 'activity.registration'
_inherit = 'event.registration'
- _name 和 _inherit 的模型名不同。 相当于把模型 event 的属性(字段 方法等)copy了一份,重新创建一个新的模型 activity,新的表里有模型 event 的字段。
例子
class ActivityRegistration(models.Model):
_name = 'event.registration'
name = fields.Char()
def say(self):
return self.check("event")
def check(self, s):
return "This is {} record {}".format(s, self.name)
class ActivityRegistration(models.Model):
_name = 'activity.registration'
_inherit = 'event.registration'
def say(self):
return self.check("activity")
- 支持多重继承,用列表表示 _inherit = ['mail', 'resource']
委托继承
class NewModel():
_name = "new.model"
_inherits = {'模型1': '关联字段1','模型2': '关联字段2'}
- 支持多重继承,并提供透明的子模型字段访问方法,好像模型有子模型字段
例子
class Child0(models.Model):
_name = 'delegation.child0'
field_0 = fields.Integer()
class Child1(models.Model):
_name = 'delegation.child1'
field_1 = fields.Integer()
class Delegating(models.Model):
_name = 'delegation.parent'
_inherits = {
'delegation.child0': 'child0_id',
'delegation.child1': 'child1_id',
}
child0_id = fields.Many2one('delegation.child0', required=True, ondelete='cascade')
child1_id = fields.Many2one('delegation.child1', required=True, ondelete='cascade')
这种继承只能继承字段,其他方法不继承可以读写子模型的字段
record.field_1 record.field_2 record.write({'field_1': 4})
如果子模型里的字段重复,只能看到_inherits第一个子模型的字段
odoo 模型继承的更多相关文章
- Odoo中的模型继承、视图继承、Qweb模板继承详解
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826114.html 在实际开发过程中,经常会遇到需要修改Odoo原生逻辑的情况.然而,直接修改Odoo底 ...
- odoo视图继承
odoo视图继承 简介继承 在odoo里可以通过继承的方式来改写已经存在的view 对比view的定义视图定义中写法多了inherit_id inherit_id指向要改写的view <fiel ...
- (03)odoo模型/记录集/公用操作
-----------------更新时间11:17 2016-09-18 星期日11:00 2016-03-13 星期日09:10 2016-03-03 星期四11:46 2016-02-25 星期 ...
- odoo12从零开始:三、2)odoo模型层
前言 上一篇文章(创建你的第一个应用模块(module))已经大致描述了odoo的模型层(model)和视图层(view),这一篇文章,我们将系统地介绍有关于model的知识,其中包括: 1.模型的类 ...
- odoo 模型与ORM
型号属性 在/模型添加activity.py文件 class ActivityEvent(models.Model): _name = 'activity.event' _inherit = 'eve ...
- Odoo模型的内置方法(可按需重写)
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826222.html ==========模型层面========== 一:_table_exist 检查 ...
- odoo controller 继承
方式一: 继承基类,直接重写方法 from odoo.addons.web.controllers.main import Export class PsExport(Export): @http.r ...
- 165.扩展User模型-继承AbstractBaseUser
继承自AbstractBaseUser模型 如果你想要修改默认的验证方式,并且对于User模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser,再添加你想要的字段 ...
- 164.扩展User模型-继承AbstractUser
继承自AbstractUser: 如果Abstractuser中定义的字段不能够满足你的项目的要求,并且不想要修改原来User对象上的一些字段,只是想要增加一些字段,那么这时候可以直接继承自djang ...
随机推荐
- linux bash的重定向
cnblogs原创 下面几种bash重定向各表示什么意思? find / -name passwd > /dev/null >& > /dev/null find / -na ...
- ubuntu14.04 安装Kdevelop 进行ROS开发
1. 安装gcc sudo apt-get build-dep gcc sudo apt-get install build-essential 2. 安装Kdevelop sudo apt-get ...
- Latex 算法Algorithm
在计算机科学当中,论文当中经常需要排版算法.相信大家在读论文中也看见了很多排版精美的算法.本文就通过示例来简要介绍一下 algorithms 束的用法.该束主要提供了两个宏包,包含两种进行算法排版的环 ...
- ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Atomicity
1.前言 Atomicity是内存访问的一个属性,描述为原子性访问,包括single-copy atomicity和multi-copy atomicity 2.基本概念 observer 可以发起对 ...
- 移动端rem单位适配使用
1.适配方法 //缩放比例!function(e,t){function i(){o=1,e.devicePixelRatioValue=o,s=1/o;var t=a.createElement(& ...
- 001_TCP/IP TIME_WAIT状态原理及监控实战
一.原理 <1>TIME_WAIT状态原理---------------------------- 通信双方建立TCP连接后,主动关闭连接的一方就会进入TIME_WAIT状态. 客户端主动 ...
- 程序打jar包
打包的时候,平常选择第二个选项 jar包中的内容为: 一般运行没有问题. 在部分情况,使用quartz时,在eclipse中不报错,使用第二种方式打包,运行会报错. 选择第一种打包方式,就不会报错了( ...
- centos7忘记登录密码修改
很多时候我们都会忘记Linux root 用户的口令,下面就教大家如果忘记root口令怎么办 第1步:开机后在内核上按“e”.截图如下 按e以后会进入内核启动页面,如下图 第2步:在linux16这行 ...
- 目标检测--Scalable Object Detection using Deep Neural Networks(CVPR 2014)
Scalable Object Detection using Deep Neural Networks 作者: Dumitru Erhan, Christian Szegedy, Alexander ...
- node 相关网站
包管理网站:https://www.npmjs.com/