暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

神州数码云基地 2021-08-12
1349

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



                          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.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
                                    复制


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




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


                                    文章转载自神州数码云基地,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                    评论