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

  • 24
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值