在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 模型继承的更多相关文章

  1. Odoo中的模型继承、视图继承、Qweb模板继承详解

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826114.html 在实际开发过程中,经常会遇到需要修改Odoo原生逻辑的情况.然而,直接修改Odoo底 ...

  2. odoo视图继承

    odoo视图继承 简介继承 在odoo里可以通过继承的方式来改写已经存在的view 对比view的定义视图定义中写法多了inherit_id inherit_id指向要改写的view <fiel ...

  3. (03)odoo模型/记录集/公用操作

    -----------------更新时间11:17 2016-09-18 星期日11:00 2016-03-13 星期日09:10 2016-03-03 星期四11:46 2016-02-25 星期 ...

  4. odoo12从零开始:三、2)odoo模型层

    前言 上一篇文章(创建你的第一个应用模块(module))已经大致描述了odoo的模型层(model)和视图层(view),这一篇文章,我们将系统地介绍有关于model的知识,其中包括: 1.模型的类 ...

  5. odoo 模型与ORM

    型号属性 在/模型添加activity.py文件 class ActivityEvent(models.Model): _name = 'activity.event' _inherit = 'eve ...

  6. Odoo模型的内置方法(可按需重写)

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/10826222.html ==========模型层面========== 一:_table_exist 检查 ...

  7. odoo controller 继承

    方式一: 继承基类,直接重写方法 from odoo.addons.web.controllers.main import Export class PsExport(Export): @http.r ...

  8. 165.扩展User模型-继承AbstractBaseUser

    继承自AbstractBaseUser模型 如果你想要修改默认的验证方式,并且对于User模型上的一些字段不想要,那么可以自定义一个模型,然后继承自AbstractBaseUser,再添加你想要的字段 ...

  9. 164.扩展User模型-继承AbstractUser

    继承自AbstractUser: 如果Abstractuser中定义的字段不能够满足你的项目的要求,并且不想要修改原来User对象上的一些字段,只是想要增加一些字段,那么这时候可以直接继承自djang ...

随机推荐

  1. Netty+SpringBoot写一个基于Http协议的文件服务器

    本文参考<Netty权威指南> NettyApplication package com.xh.netty; import org.springframework.boot.SpringA ...

  2. Flex布局和Bootstrap布局两者的比较

    在Bootstrap中采用12栅格的布局,12份随意分配,但是不能解决5等分,7等分的问题.所以flex布局来协助. bootstrap的布局方式 <div class="row&qu ...

  3. ARMV8 datasheet学习笔记3:AArch64应用级体系结构之Synchronization and semapores

    1.前言 本文主要介绍原子变量的实现原理,对原子变量的修改有一套特殊的机制 2. Local monitor和Global monitor UP时执行Load EX和Store EX时仅需关注Loca ...

  4. Project Euler Problem8

    Largest product in a series Problem 8 Find the greatest product of five consecutive digits in the 10 ...

  5. HDU 3579

    标准同余方程组,只是在求出值后如果为0,应该输出Mi的Lcm: #include<iostream> #include<cstdio> #include<cstring& ...

  6. 04-Bootstrap的插件

    1.下拉菜单 代码如下: <div class="dropdown"> <button class="btn btn-default dropdown- ...

  7. 深入对比TOML,JSON和YAML

    坦率地说,在我开始与Hugo TOML合作之前,我感到羞耻是一个需要发现的新领域,但我对YAML和JSON非常熟悉.本文将帮助您了解如何通过不同的数据格式构建数据.       在Hugo中,您可以将 ...

  8. java多线程快速入门(十一)

    在方法上面加synchonizd用的是this锁 package com.cppdy; class MyThread7 implements Runnable { private Integer ti ...

  9. poj1177 矩形周长并

    线段树扫描线的模板题,一个月前写的发现忘了一些还是要看看以前的博客呀! /* 思路:数据小不用离散化处理,线段树叶子结点维护一个区间 */ #include<iostream> #incl ...

  10. Promise 基础学习

    Promise 是ES6的特性之一,采用的是 Promise/A++ 规范,它抽象了异步处理的模式,是一个在JavaScript中实现异步执行的对象. 按照字面释意 Promise 具有"承 ...