当前位置:   article > 正文

odoo16-03-模型类中的方法函数ORM方法_odoo16 装饰器 'multi

odoo16 装饰器 'multi

模型类中的方法函数

models.py
1.模型类配置
from odoo import models, fields, api


class test_module(models.Model):
    # 模型名称,类的唯一标识,其他类可以通过此字段引用本类
    _name = 'test.module' # 数据库中会自动将.转换为_
    # 多模型类的描述,提高查询的友好性,为用户查看该模型的标题
    _description = 'test_module.test_module'
    # 设置该模型展示时默认的排序字段
    _order = 'create_date desc'  # 按照创建时间倒序
    # odoo默认使用name字段,作为数据记录的描述,可以用该字段来指定其他字段,也可以使用 name_get() 方法做为描述。
    _rec_name = ''
    # 模型在后台存储的表名,在默认情况下odoo会将 _name 中的 . 替换为 _ 作为表名,通过该字 段可以指定。
    _table = ''
    # 用于继承
    _inherit = ''
    _inherits = ''
    
    # 定义 SQL 约束的列表属性
    _sql_constrains = [
        # 约束名称,SQL 表达式,违反约束时显示的错误消息
        ('constraint_name', 'sql_expression', 'error_message'),
    ]

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
2.字段配置
# 字段
name = fields.Char()
value = fields.Integer()
value2 = fields.Float(compute="_value_pc", store=True)
# 通常用于在用户界面上显示一个长文本,以提供更详细的说明或说明
description = fields.Text() 

# 货币类型字段
currency_id = fields.Many2one(strings='货币类型',comodel_name = 'res.currency')
retail_price = fields.Monetary('零售价格',currency_field='currency_id')

# 数据关联
# comodel_name:必填参数,指定关联模型的名称。它是一个字符串,用于指定目标模型的技术名称。
# string:可选参数,用于设置字段的标签或显示名称。它是一个字符串,将用于在用户界面上显示字段的标签

fields.Many2one(comodel_name=None, string=None, **kwargs)
# ondelete:指定当目标记录被删除时的行为。默认情况下,它为 cascade,表示级联删除关联记录。
# 还可以设置为 restrict(阻止删除)、set null(设置为空)等。
# domain:用于限制可选的关联记录的域表达式。它是一个字符串或元组,用于筛选关联模型中的记录。
# context:为该字段提供上下文变量。它是一个字典,用于传递其他信息给关联模型。
# required:指定是否该字段是必需的。默认为 False,表示可选字段;设置为 True 表示必需字段。
# readonly:指定是否只读。默认为 False,表示可编辑的字段;设置为 True 表示只读字段
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
属性参数类型解释默认值
stringunicode用户可见的字段标签字段名
sizeInt字符串长度不限
**required **boolTrue-不允许为空False
helpunicode向用户提供的提示信息‘’
indexbool对字段创建数据库索引False
readonlybool只读False
copybool复制记录时是否应复制字段值True
default根据字段的类型默认值
translatebool根据多语言来显示字段False
groupsbase.group_user字段级的权限控制,只有对应的组对其有访问权限
states{‘lost’:[(‘readonly’),True]}对ui的展现设置属性
digitstyple(总位数, 小数位数) | 字符串指定数值字段(例如浮点数或整数)的显示格式和精度 | 根据需要在后台进行配置2
3.装饰器使用
@api.model:定义静态方法,可以在模型类的任何实例或记录上调用,而不需要实例化模型类。

# 弃用 @api.multi:定义实例方法,可以在模型类的实例上调用,并且可以在多个记录上进行迭代。

@api.one:定义实例方法,只能在模型类的单个记录上调用。

@api.depends:定义计算字段(computed field),值会根据指定的依赖字段自动计算。

@api.constrains:定义约束方法,在保存记录时会进行验证,并在不满足约束条件时引发异常。

@api.onchange:定义触发方法,在指定的字段值发生更改时自动触发。

@api.model_create_multi:定义批量创建记录的方法,可以一次性创建多个记录。

@api.model_delete_multi:定义批量删除记录的方法,可以一次性删除多个记录。

@api.model_cr:定义在模型类的数据库表创建时执行的方法。

@api.model_save:定义在模型类的记录保存时执行的方法。

@api.returns:用来指定API接口返回的数据类型。它可以在API文档中使用,用于描述API接口的返回值类型,帮助开发者理解该接口返回的数据结构。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
常用方法
方法解释参数返回值
create创建vals_list:Dict | List[Dict]创建成功的记录集
write更新vals:dictTrue成功False失败
unlink删除
read获取数据可不传字典列表
search查询数据domain:List符合查询条件的记录集
search_read查询数据可不传符合查询条件的字典列表
其他方法
方法解释参数返回值
search_count统计行数int-查询结果的行数
name_get文本标签获取tuple-记录的文本表达形式
name_search根据记录文本标签查询记录
_auto_init模块升级安装模型初始化
init模块升级安装模型初始化
fields_get_keys模型字段名称获取
copy记录复制
exists检查数据集是否为空
browse使用id创建记录集List[int]返回符合条件的数据集
ids获取记录集中的id列表
ensure_one校验记录集是否为单例
with_env替换记录集的环境信息
sudo赋予超级权限
with_user替换记录集用户
with_context替换记录集上下文
mapped读取记录集字段值
filtered记录集筛选
filtered_domaindomian格式记录集筛选
sorted记录集排序
update记录集更新
ORM常用方法详解
self.env

self.envOdoo中表示当前环境(Environment)的上下文。它是一个用于访问数据库和模型数据的重要对象

# 通过self.env获取当前环境对象,并使用该环境对象访问res.users模型
self.env['res.users']
  • 1
  • 2
# 查询一条记录
xx = self.env['res.users']
xx.search([('id', '=', '1')]).unlink()
  • 1
  • 2
  • 3
1.create
def create(self, vals_list):
    '''
        为模型创建新记录。
        新记录初始化使用dicts列表中的值'vals_list',必要时使用:meth: ~.default_get'中的值。
        :param  vals_list:list[dict] | dict
        :return: 已创建的记录
        :AccessError:如果当前用户不允许创建指定型号的记录
        :ValidationError:如果用户试图为选择字段输入无效的值
        :ValueError:如果在创建值中指定的字段名不存在。
        :UserError:如果操作的结果将在对象的层次结构中创建循环
        (比如将一个对象设置为它自己的父对象)
    '''
# 在xx对象中,创建一条新纪录
self.create({'field': "value"})
# 在xx对象中,创建多条新纪录
self.create([{'field1': "value1"},{'field2': "value2"}])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
2.write
def write(self, vals):
    '''
        用提供的值更新`self`中的所有记录。
        :param  vals:dict 要更新的字段和要在其上设置的值
        :引发AccessError:如果用户不允许修改指定的记录/字段
        :引发ValidationError:如果为选择字段指定了无效值
        :引发UserError:如果操作的结果将在对象的层次结构中创建循环(例如将对象设置为其自己的父对象)
    '''
# 先获取需要修改的表对象,再将该表中的某条记录的数据进行一个更新
self.write({'field': "value"})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
3.unlink
def unlink(self):
    '''
		删除`self`中的记录。
		:引发AccessError:如果用户不被允许删除所有给定的记录
		:引发UserError:如果该记录是其他记录的默认属性
    '''
# 先获取需要删除的表对象,再将该表中的某条记录删除掉
self.unlink()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
4.read
def read(self, fields=None, load='_classic_read'):
    '''
        读取`self`,low-level/RPC中记录的请求字段方法。
        :param  fields:list 要返回的字段名(默认为所有字段)
        :param  load:str 加载模式,目前唯一的选项是设置为`None`避免加载m2o字段的`name_get`
        :返回:将字段名映射到它们的值的字典列表,每个记录使用一个字典
        :rtype:列表
        :抛出AccessError:如果用户不被允许访问请求的信息
        :抛出ValueError:如果请求的字段不存在
    '''
xx = read(self,fields)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
5.search
@api.model
@api.returns('self',
        upgrade=lambda self, value, domain, offset=0, limit=None, order=None, count=False: value if count else self.browse(value),
        downgrade=lambda self, value, domain, offset=0, limit=None, order=None, count=False: value if count else value.ids)
def search(self, domain, offset=0, limit=None, order=None, count=False):
    '''
        search(domain[,offset=0][,limit=None][,order=None][,count=False])
        搜索基于“域”的记录
        :ref: `search domain <reference/orm/domains>`
        :param domain:  :ref: '一个搜索域<reference/orm/domains>。使用空的列表以匹配所有记录。
        :param  offset:int 要忽略的结果数量(默认值:none)
        :param  limit:int 要返回的最大记录数(默认:所有)
        :param  order:str 排序字符串
        :param  count:bool 如果为True,则只计算并返回匹配记录的数量(默认值:False)
        :returns: 最多`limit`条匹配搜索条件的记录
        :引发AccessError:如果用户不被允许访问请求的信息
    '''
# 查询模型内的全部数据
result= self.env['res.users'].search([])
# 查询指定条件数据
xx = result.search([('id', '=', 1), ('status', '=', True)])
# 查询前2条数据
xx = result.search([
      ('name', '=', attachment_name),
      ('res_model', '=', self.model),
      ('res_id', '=', record.id)
      ], limit=2)
# 关联查询
student = self.env['emp.student']
teacher = self.env['emp.teacher']
xx = teacher.search([('id', '=', student.search([('id', '=', 1)]).teacher_id.id)])
print (xx)
print (xx.name)
print (xx.sex)#类似于sql中的嵌套查询
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
6.search_read
@api.model
def search_read(self, domain=None, fields=None, offset=0, limit=None, order=None, **read_kwargs):
    '''
        执行 a:meth: `search`,然后执行 a:meth:`read`。
        :param domain:搜索域,参见:meth:`Search '中的' args`'参数。默认为将匹配所有记录的空域。
        :param fields:要读取的字段列表,参见:meth:`read`中的`fields`参数。默认为所有字段。
        :param  offset:int 要跳过的记录数,参见:meth:`search '中的' offset '参数。默认为0。
        :param  limit:int 要返回的最大记录数,参见:meth:`search '中的' limit '参数。默认为无限制。
        :param order:排序结果的列,参见:meth:`search '中的' order '参数。默认为无排序。
        :param read_kwargs:用于调用的所有已读关键字参数
            `read(…, **read_kwargs)`方法,例如您可以使用
            `search_read(…, load= ")`,以避免计算name_get
        :return:包含查询字段的字典列表。
        :rtype:list(dict)。
    '''
xx = search_read(domain,fileds)
# 如果不需要权限进行增删改查,则直接在模型后面加上sudo()(一般适用于接口)
xx = request.env['res.users'].sudo().search([('id', '=', pk)])
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
  

闽ICP备14008679号