Odoo12 ORM API ☞ Inheritance and extension

2023-12-20 04:48

本文主要是介绍Odoo12 ORM API ☞ Inheritance and extension,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Inheritance and extension


Odoo提供了三种不同的机制来以模块化方式扩展模型:

  • 从现有模型创建新模型,向副本添加新信息,但保留原始模块的原样
  • 扩展其他模块中定义的模型,替换以前的版本
  • 将一些模型的字段委托给它包含的记录

Odoo继承

Classical inheritance(经典继承)

同时使用_inherit和_name属性时,Odoo使用现有的模型(通过_inherit提供)作为基础创建一个新模型。
新模型从其基础模型获取所有字段,方法和元信息(defaults & al)。

class Inheritance0(models.Model):_name = 'inheritance.0'_description = 'Inheritance Zero'name = fields.Char()def call(self):return self.check("model 0")def check(self, s):return "This is {} record {}".format(s, self.name)class Inheritance1(models.Model):_name = 'inheritance.1'_inherit = 'inheritance.0'_description = 'Inheritance One'def call(self):return self.check("model 1")

当使用它们:

 	a = env['inheritance.0'].create({'name': 'A'})b = env['inheritance.1'].create({'name': 'B'})a.call()b.call()

得到结果:

		"This is model 0 record A""This is model 1 record B"

第二个模型继承自第一个模型的检查方法及其名称字段,但是重写了调用方法,就像使用标准的Python继承一样。

Extension(扩展)

当使用_inherit但不用_name时,新模型取代现有模型并进行扩展。这对于向现有模型添加新字段或方法(在其他模块中创建)非常有用,或者自定义或重新配置它们(例如,更改其默认排序顺序):

  _name = 'extension.0'_description = 'Extension zero'name = fields.Char(default="A")class Extension1(models.Model):_inherit = 'extension.0'description = fields.Char(default="Extended")
	record = env['extension.0'].create({})record.read()[0]

得到结果:

	 {'name': "A", 'description': "Extended"}

它也会产生各种 automatic fields ,除非它们被禁用。

Delegation(委托)

三种继承机制提供了更大的灵活性(可以在运行时更改)但修改更少。使用_inherits模型将当前模型中未找到的任何字段的查找委托给“子”模型。通过在父模型上自动设置的 Reference 字段执行委派:

class Child0(models.Model):_name = 'delegation.child0'_description = 'Delegation Child zero'field_0 = fields.Integer()class Child1(models.Model):_name = 'delegation.child1'_description = 'Delegation Child one'field_1 = fields.Integer()class Delegating(models.Model):_name = 'delegation.parent'_description = '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 = env['delegation.parent'].create({'child0_id': env['delegation.child0'].create({'field_0': 0}).id,'child1_id': env['delegation.child1'].create({'field_1': 1}).id,})record.field_0record.field_1

结果如下:

		01

并且可以直接在委托字段上书写:

		record.write({'field_1': 4})

Warning!
使用委托继承时,方法不是继承的,只是字段

这篇关于Odoo12 ORM API ☞ Inheritance and extension的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/514808

相关文章

5分钟获取deepseek api并搭建简易问答应用

《5分钟获取deepseekapi并搭建简易问答应用》本文主要介绍了5分钟获取deepseekapi并搭建简易问答应用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需... 目录1、获取api2、获取base_url和chat_model3、配置模型参数方法一:终端中临时将加

使用DeepSeek API 结合VSCode提升开发效率

《使用DeepSeekAPI结合VSCode提升开发效率》:本文主要介绍DeepSeekAPI与VisualStudioCode(VSCode)结合使用,以提升软件开发效率,具有一定的参考价值... 目录引言准备工作安装必要的 VSCode 扩展配置 DeepSeek API1. 创建 API 请求文件2.

使用SpringBoot创建一个RESTful API的详细步骤

《使用SpringBoot创建一个RESTfulAPI的详细步骤》使用Java的SpringBoot创建RESTfulAPI可以满足多种开发场景,它提供了快速开发、易于配置、可扩展、可维护的优点,尤... 目录一、创建 Spring Boot 项目二、创建控制器类(Controller Class)三、运行

【LabVIEW学习篇 - 21】:DLL与API的调用

文章目录 DLL与API调用DLLAPIDLL的调用 DLL与API调用 LabVIEW虽然已经足够强大,但不同的语言在不同领域都有着自己的优势,为了强强联合,LabVIEW提供了强大的外部程序接口能力,包括DLL、CIN(C语言接口)、ActiveX、.NET、MATLAB等等。通过DLL可以使用户很方便地调用C、C++、C#、VB等编程语言写的程序以及windows自带的大

如何更优雅地对接第三方API

如何更优雅地对接第三方API 本文所有示例完整代码地址:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/third 我们在日常开发过程中,有不少场景会对接第三方的API,例如第三方账号登录,第三方服务等等。第三方服务会提供API或者SDK,我依稀记得早些年Maven还没那么广泛使用,通常要对接第三方

Java基础回顾系列-第五天-高级编程之API类库

Java基础回顾系列-第五天-高级编程之API类库 Java基础类库StringBufferStringBuilderStringCharSequence接口AutoCloseable接口RuntimeSystemCleaner对象克隆 数字操作类Math数学计算类Random随机数生成类BigInteger/BigDecimal大数字操作类 日期操作类DateSimpleDateForma

Restful API 原理以及实现

先说说API 再说啥是RESRFUL API之前,咱先说说啥是API吧。API大家应该都知道吧,简称接口嘛。随着现在移动互联网的火爆,手机软件,也就是APP几乎快爆棚了。几乎任何一个网站或者应用都会出一款iOS或者Android APP,相比网页版的体验,APP确实各方面性能要好很多。 那么现在问题来了。比如QQ空间网站,如果我想获取一个用户发的说说列表。 QQ空间网站里面需要这个功能。

京东物流查询|开发者调用API接口实现

快递聚合查询的优势 1、高效整合多种快递信息。2、实时动态更新。3、自动化管理流程。 聚合国内外1500家快递公司的物流信息查询服务,使用API接口查询京东物流的便捷步骤,首先选择专业的数据平台的快递API接口:物流快递查询API接口-单号查询API - 探数数据 以下示例是参考的示例代码: import requestsurl = "http://api.tanshuapi.com/a

Go 在orm中使用反射

作为静态语言,golang 稍显笨拙,还好 go 的标准包reflect(反射)包弥补了这点不足,它提供了一系列强大的 API,能够根据执行过程中对象的类型来改变程序控制流。本文将通过设计并实现一个简易的 mysql orm 来学习它,要求读者了解mysql基本知识,并且跟我一样至少已经接触 golang 两到三个月。 orm 这个概念相信同学们都非常熟悉,尤其是写过rails的同学,对acti

WordPress开发中常用的工具或api文档

http://php.net/ http://httpd.apache.org/ https://wordpress.org/ https://cn.wordpress.org/ https://core.svn.wordpress.org/ zh-cn:开发者文档: https://codex.wordpress.org/zh-cn:%E5%BC%80%E5%8F%91%E8%80%