版权声明:本文由神州数码云基地团队整理撰写,若转载请注明出处。

大家好。本篇文章主要讲述的内容是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 models
class 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

字段名 类型 说明
id Integer 表主键莫模型中记录的唯一标识。
create_date Datetime 记录的创建日期。
create_uid Many2one 记录的创建者。
write_date Datetime 记录的最后修改日期。
write_uid Many2one 记录的最后修改者。

3.2 保留字段

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

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

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

字段名 类型 说明
active Boolean 控制记录是否可见
name Unicode(字符串) 显示和显示各种行为


4、常用字段属性

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

4.1 odoo字段共同属性

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

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

属性名 属性 默认值 作用及说明
string unicode(字符串) 字段名 在视图中显示的字段标签
required bool False 表示这个字段是否可以为空
readonly bool False 表示这个字段是否只读
help unicode(字符串) 为用户提供帮助提示
index bool False 是否在对应数据库列上创建数据库索引

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.model
def _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.model
def _default_values(self):
    default_value = 100
    if flag = True:
        default_value = 500
    return default_value

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

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

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐