当前位置: 首页 > news >正文

odoo模型继承

odoo模型继承

模块化是Odoo一个非常重要的功能。一个模块通常定义一块业务内容,模块之间是可以交互的。所以从已有模块中去继承修改原有模块功能就很有必要。

Odoo中,模型之间也定义了一套继承的逻辑,目前有三种继承方

式:

1、拓展继承

2、原型继承

3、委托继承

通过_inherit、__name 、_inherits的不同用法来标识

在这里插入图片描述

扩展继承(常用)

在扩展继承中,继承模型从原有模型中获取所有方法和字段,即原有模型中的所有函数和字段都可以从继承模型中访问。

扩展继承不会创建新的模型,能够直接修改模型定义,新增字段将直接体现在原有模型中,已有字段也可以进行增量修改(如果该字段在父类中已存在,仅修改在继承类中声明的属性,其它的保持原有父类中的内容不变。),或对原模型中的函数进行重写和修改。

在数据库层,ORM对同一张数据表添加字段,没有新表生成。

PS:对于字段的继承,直接改变字段的类型不可取,因为在数据库中会复制出一个新字段,例如字段age原本为int类型,在子类中将其改为float类型,当升级后在数据库中会出现age1这样的一个字段,并且原字段age也存在,再次升级还会出现age2,每次升级都会新复制出一个字段。

在继承的过程中还需要注意外键问题,在修改原字段的时候,尽量不要去删除原有字段属性。

在这里插入图片描述

使用_inherit进行模型的继承,字段和方法,若父类中没有,则进行新增,有则进行修改重写,方法中使用super调用父类的方法,该种继承方式不会创建新的模型,对原模型直接进行修改。

方法的重写:

在这里插入图片描述

重写了default_get方法

super为调用父类中的default_get方法

原型继承

原型继承:通过_inherit属性实现类继承,添加一个带有不同标识符的_name属性来实现。

对现有模型完整的复制,有单独的数据库表。本例中,Odoo会拷贝res.partner模型的定义,创建一个新模型library.member。新的 模型有一个包含自身数据的数据表,与原有模型 res.partner 完全独立开来。

原型继承通过同时使用 _name 和 _inherit 属性来实现。在模型中使用这两个属性时,Odoo会拷贝 _inherit 的模型定义,创建一个带有 _name 属性的新模型。

原型继承复制父类中的所有属性,会拷贝字段、属性和方法。

在这里插入图片描述

这种继承方式会直接复制一个新的模型,原来的模型会保留并且不会做出改变,改变都会在新模型进行修改,新增新增。

委托继承

允许将模型的每个记录链接到父模型的记录,并提供对该父记录的字段的透明访问。用_inherits模型属性设置我们想要继承的父级模型,

它的值是一个键值对字典,键是被继承的模型,值是用于关联辅机模型的字段名

委托继承使用的不是 _inherit,而是 _inherits 属性。_inherits属性设置我们想要继承的父级模型。本例中只有一个 res.partner 模型。它的值是一个键值对字典,键是被继承的模型,而值是用于关联它们的字段名。本例中,partner_id 是用于关联父级模型Partner的字段。

支持多态继承,可以从两个或多个其它的模型中进行继承。

注意:代理继承仅用于字段,而不能用于方法。因此,如果原有模型有一个 do_something() 方法,新模型不会自动继承它。

在这里插入图片描述

create,write等方法的重写

这些方法的继承重写需要在类之外,为了避免在调用时候出现bug,例如多创建数据,

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重写完之后,需要在类之前,模型.create = create 以及模型.write= write

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Android初学者书籍推荐
  • 高智能土壤养分检测仪:农业生产的科技新助力
  • 数据结构——约瑟夫环C语言链表实现
  • 短视频商城系统源码揭秘:架构设计与实现
  • 信立方大模型 | 以AI之钥,开拓智能守护新疆界
  • 访问控制的定义与原理
  • LeetCode122.买卖股票的最佳时机II(动态规划)
  • Web 性能入门指南-1.2 分析在线零售 Web 性能及优化方向
  • spring xml实现bean对象(仅供自己参考)
  • 流量用超被扣费,别着急这个钱是可以退回来的!
  • thinkphp8框架源码精讲
  • 前端开发工具
  • 1.pwn的汇编基础(提及第一个溢出:整数溢出)
  • 【python】PyQt5可视化开发,鼠标键盘实现联动界面交互逻辑与应用实战
  • Spring Boot 常用 Starter
  • 【comparator, comparable】小总结
  • 【翻译】babel对TC39装饰器草案的实现
  • Angular Elements 及其运作原理
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • JavaScript新鲜事·第5期
  • js对象的深浅拷贝
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MySQL数据库运维之数据恢复
  • SpiderData 2019年2月16日 DApp数据排行榜
  • vue-cli3搭建项目
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 模型微调
  • 普通函数和构造函数的区别
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • 一些css基础学习笔记
  • 阿里云服务器购买完整流程
  • 积累各种好的链接
  • 继 XDL 之后,阿里妈妈开源大规模分布式图表征学习框架 Euler ...
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​flutter 代码混淆
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • #define用法
  • #Linux(帮助手册)
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • (7)摄像机和云台
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十一)图像的罗伯特梯度锐化
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • .gitignore文件---让git自动忽略指定文件
  • .NET 设计模式初探
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net 执行Linux下多行shell命令方法
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 使用反射调用含 ref 或 out 参数的方法
  • .Net下的签名与混淆
  • .NET周刊【7月第4期 2024-07-28】
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法