您当前的位置:首页 >> 聚焦 >  >> 
odoo16 后端开发——后端模型(STEP3)——对象与装饰器
来源: 哔哩哔哩      时间:2023-08-31 23:20:23

后端模型就是要用好odoo提供的装饰器、ORM、内置函数及字段,本章节我们将向大家介绍后端模型(STEP3)——装饰器。

在了解装饰器之前,你必须对面向对象要有一定的理解。还是以学生举例说明。

面向对象


(资料图片仅供参考)

类是具有相同特性(数据元素)和行为(功能)的对象的抽象。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。

学生类StudentArchives,在odoo里面我们称之为模型,在数据库里面对应的是数据表。

学生小明,是学生类的实例,也就是对象。

类也是一种数据类型,我们用Many2One、One2Many、Many2Many来建立类的数据类型。

属性

类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。姓名、身份证号、出生日期、性别、年龄都是属性。

操作

类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。类映射的每一个对象都具有这些数据和操作方法,类的继承具有层次性和结构性,高层次对象封装复杂行为,具体细节对该层次知识保持透明,可以减小问题求解的复杂度。

例如计算学生的年龄,就是对学生的一个操作。

封装

封装是将数据和代码捆绑到一起,对象的某些数据和代码可以是私有的,不能被外界访问,以此实现对数据和代码不同级别的访问权限。防止了程序相互依赖性而带来的变动影响,面向对象的封装比传统语言的封装更为清晰、更为有力。有效实现了两个目标:对数据和行为的包装和信息隐藏。

例如计算学生的年龄,我们只需要给一个学生的出生日期,那么就应该计算出学生的年龄,至于怎么计算的,调用者不关心。

学会用"self"、"."、"的"

self可以是类,也可以是对象。

例如查询的学生信息:

在类以外的地方,需要写成这样。

在类里面,可以写成这样,这里的self指的是类。

在计算学生年龄的时候,这里的self指的是具体的某一个学生。

可以用对象+"的"+属性来区分self到底是类还是对象,以上面的为例:

学生年龄——完整的意思是,学生小明的年龄,学生小明是对象,年龄是属性,因此这里的self是对象;

学生信息——不能说成学生小明的信息,因为信息不是学生类的属性,因此这里的self是类。

在了解了面向对象,我们接着了解装饰器。

概念介绍

在Odoo 16中,装饰器(decorators)是一种常见的Python编程技术,它允许我们在不修改原始代码的情况下,对类、方法或函数进行扩展和增强。

@

这个装饰器用于标识一个模型方法(Model Method),它只能访问模型类和其对应的数据库,不能访问具体的记录。它通常用于执行通用的业务逻辑,不依赖于任何特定记录的情况。

在代码中没有用到self或者self不能表达成对象+"的"+属性,即这个方法不能用于对象,也就是数据库的具体记录。

@

当某个字段的值发生变化时,使用这个装饰器来指定相关字段,从而告诉Odoo在计算该字段值时要依赖于哪些字段的值。当依赖的字段发生变化时,Odoo会重新计算该字段的值。

@

当模型记录的某些约束条件不满足时,使用这个装饰器来标识一个约束方法。当保存记录时,Odoo会自动检查这些约束并阻止保存操作。

depends和constrains的代码一定要写成如下格式,因为在升级的时候,odoo会对所有的学生对象进行计算,所以这里的self是多个对象。

@

这个装饰器用于标识一个字段的onchange方法。当指定的字段的值发生变化时,Odoo会自动调用这个方法来执行相应的逻辑。

总结

一定要理解面向对象的self,这是很多初学者绕不过去的地方,如果明确是一个对象调用,可以用_one();

标签:

X 关闭

X 关闭