扫码阅读
手机扫码阅读

Odoo二次开发----Odoo常用字段

299 2023-09-06

大家好。本篇文章主要讲述的内容是Odoo常用字段类型。

本文将从Odoo模型概述、Odoo的常规字段、自动字段和保留字段、常用字段属性、四个小节进行分享

1、Odoo模型概述

1.1 初识Model

odoo中的Model分为三类

models.AbstractModel

抽象模块: 类似于抽象类,常用于继承

models.Model

基础模块: 会根据字段和模型名在后台数据库生成对应的数据表文件 常用此类Model

models.TransientModel

临时模块: 会在后台生成对应的表,根据系统设置的清除频率,定时清除数据,常用来作为向导和存储临时数据

三者的继承关系如下图

1.2 模型与数据库对应关系

Odoo中的不同字段类型,丰富了其所在模型的信息。在定义的模型中,出现了何种类型的字段,就表示当前模型可以存储什么类型的信息。在这里我们可以理解为,模型就是由各种类型的字段组合出来的,也就是字段装饰了模型。

那odoo中定义的模型以及字段和数据库有什么关联呢?其实在Odoo中有一个关键组件---ORM层,是用来进行对象-关系映射的。因此在我们创建一个模型后,模型就会映射成数据库中的表,而模型中的字段,会映射成表中的列。

在Odoo中 每个模型(Model)一般是由字段+函数组成

但是,这里的字段可不是python语法中的基本数据类型,而是继承odoo.fields.Field的封装类。

因此,这里要注意,为模型中的字段赋值时,和python中的基本数据类型赋值不同。odoo字段需要去调用odoo.fields.Field中的create方法或write方法进行赋值。

这个时候,我们就会有一个疑问。模型和数据库怎么使用ORM层进行交互的呢?

这里我们以下面的流程图来回答这个疑问

我们可以看到,实际上在我们修改一条数据的时候。odoo框架与此同时帮我们生成并执行了一条SQL语句,以此来达到了模型字段数据与数据库进行交互的作用。

新建一条数据是执行的create方法。与上述流程图大多一致。

这里还要注意一点,_name是模型中最重要的属性。此属性会映射成对应的数据库表名,在模型中是不能缺少的。

下面就是一个模型最简的完整定义:

from odoo import modelsclass TestModel(models.Model): _name = 'Test.model' 

2、常规字段

2.1 基础字段类型

Char: 字符型,(基本字符串字段,可以限制长度,通常在客户端显示为单行字符串)

name = fields.Char(string='字符型')

Text: 文本型, (没有长度限制 在客户端中显示为文本框 可以填写多行字符串)

notes = fields.Text(string='文本型')

Boolean: 布尔型 (包含True,和False两个值)

flag = fields.Boolean(string='布尔型')

Integer: 整型 (封装一个int)

nums = fields.Integer(string='整型)

Float: 浮点型 (digits属性定义整数部分和小数部分的位数)

money = fields.Float(string=‘浮点型)rate =  fields.Float(string=’概率计算‘,digits=(12,6))

2.2 高级字段类型

Date 日期类型 (包含有年月日)

now = fields.Date(string='日期型')

Datetime: 时间戳型 (包含有年月日 时分秒)

time = fields.Datetime(string='时间戳')

Html:富文本类型 (封装一个html代码内容)

page = fields.Html(string='富文本类型')

Binary: 二进制型 (封装二进制内容(比如文件、图像、音频视频))

any = fields.Binary(string='二进制型")

Selection 枚举类型 (Selection字段类型一般作为下拉列表显示 使用的时候需要在其中预定义展示数据)

gender = fields.Selection([("1", "男性"), ("2", "女性")])

reference 引用型 格式如下

其中selection是返回元组列表的函数或者是表示该字段引用哪个对象的元组列表,reference字段在数据库表中的存储形式是(对象名,ID)

fields.reference(字段名, selection, size, ... )

上例表示 字段ref可以引用哪些对象类型的resource,可引用的对象类型从下拉框选择。下拉框的选项由函数links_get返回

2.3 关系字段类型

在关系字段类型中,包含有多对一 一对多 和多对多三种类型,其中 一对多和多对一是一对字段,经常一起使用。为了更好的理解关系字段 我首先以数据库中的表举例,这里使用学生表 和 教室表为例。

2.3.1 many2one 和 one2many

可以看到 多个学生对应一个教室 是多对一的关系 一个教室对应多个学生 是一对多的关系 并且学生表中含有一个class_id的外键

那么在odoo中使用多对一字段时,需要在字段属性中填写关联模型名称,返回的值就是外键。对应的就是关联模型的主键。当使用一对多字段时,需要在字段属性中填写,关联模型名称,关联字段(也就是外键)。

这样 多对一 和 一对多关系就建立起来了

这里需要注意一点 在使用many2one字段的时候,可以不用同时使用one2many字段。但是在使用one2many字段的时候,many2one字段必须同时使用。

2.3.2 many2many

同样的,多对多关系。一个学生对应多门课程,一门课程也可以对应多个学生,是多对多的关系。此时就需要指定一张中间表,来存储两张关联表的主键字段。

在odoo中使用many2many这个字段时,需要指定,关联模型名称、中间表名称、当前的关联模型ID、需要关联模型的ID。

这里要注意,当使用many2many这个字段时。如果没有指定关联表 Odoo就会自动创建一张关联表,此关联表中包含两张表的主键字段。

假设我们在学生模型中定义与课程模型多对多的关系字段 写法如下图所示

第一个属性就是课程模型名称、第二个属性就是中间表名称、第三个属性就是学生id、第四个属性就是课程id。

3、自动字段和保留字段

3.1 自动字段

什么是自动字段呢,在我们初始创建模型的时候,即使你没有在模型中创建以下几个字段。映射出的表中 也会出现对应的列。这是由odoo系统管理创建的。

这几个字段是:ID create_date create_uid write_date write_uid

3.2 保留字段

还要注意 在odoo中,有几个字段比较特殊。是odoo预定义的保留字段。比如说 active 和 name

active字段管理记录的显示和隐藏,如果你创建了这个字段,又恰好为其增加了属性default=Fasle ,那么你创建的所有记录都将看不到,除非你将default=False 过滤出来。

name 显示各种行为。如果没有,也不会影响系统的运行,它只是会在你打开一条记录后,无法显示你当前的记录是什么。

4、常用字段属性

接下来,我将会介绍常用字段的属性。在第一小节中,我们提到,是字段装饰了模型。那么同样的,对于字段来说,字段也可以由属性进行装饰,通过配置属性作为参数传递,对字段进行配置。

4.1 odoo字段共同属性

通过之前的举例观察,我们可以看到,有些字段虽然不是同种类型,但他们有相同的属性。比如 string 这个字段属性,像string一样可以拿去修饰不同字段的属性,我们称为共同属性。

在odoo中,常用的odoo共同属性有:string required readonly help index

4.2 odoo字段特有属性

那么除了上述的共同属性,还有一些各个字段的所拥有的常用属性。

size 长度属性,在odoo中,可以设置该字段的长度。这个时候就可以使用字段中的size属性。

nums = fields.Integer(string='整型', size=20)

default 默认值属性,在odoo中,我们可以为简单字段,添加默认值属性,以保证在创建一条记录时,这个字段有一个默认值。

flag = fields.Boolean(string='布尔型', default=True)

store属性可以定义该字段 是否存入数据库中 如果为False 那么此字段将不会存入数据库中

any = fields.Binary(string='二进制型', store=False)

在odoo中,除了使用default属性为字段设置值,可以通过一个函数计算出来。调用这个函数的属性就是compute 属性。如下图所示 我们预先定义一个计算函数,监听number字段。当number字段赋值的同时,money字段也会同时计算出一个值,这就是compute属性的作用。

4.3 动态selection

一般作为下拉选项,Selection字段的选项内容是固定的。但是,根据一些特殊的业务需求。可能会需要同一个Selection字段在不同的场景下有不同的下拉选项。那这种特殊的需求怎样去实现呢?

这里就需要使用selection属性,并在其中传递一个函数,来动态显示下拉选项。

gender = fields.Selection(string='性别', selection='_selection_filter', default='0')  @api.modeldef _selection_filter(self): res_filter = [('1','男性'),('2','女性')] if flag = True: res_filter = [('1','男性'),('2','女性'),('3',"其他")] return res_filter

这样按照上面的代码逻辑 Selection的下拉选项就会随着_selection_filter函数中的if条件进行动态的变化

4.4 动态default

同样的,根据一些特殊的业务需求,默认值也可能需要在不同的场景有不同的展示。这时候可以结合lambda表达式和对应的函数进行实现。

nums = fields.Integer(string='零售价',size=20,default = lambda self: self._default_values)    @api.modeldef _default_values(self): default_value = 100 if flag = True: default_value = 500 return default_value

这样就能实现动态默认值的显示。

本篇就先讲到这里,喜欢的话可以点个赞。

原文链接: http://mp.weixin.qq.com/s?__biz=Mzg5MzUyOTgwMQ==&mid=2247486812&idx=1&sn=e330fb6b42ea6d23f00b21280c35f9c6&chksm=c02c36faf75bbfec1f2dcaee8d87c2c493f483b11b5fec1e47ef3d7a56cb0d28430a0e88b25e#rd