今天继续研究ORM的BaseModel,昨天研究了一下所有常用属性的具体用法,那么今天研究一下BaseModel中一些常用的方法,我们学会它们并灵活的应用它们,可以为我们开发解决很多的问题。

odoo ORM的4大将 - 增删改查(非常重要)

增 - create方法
@api.model_create_multi
@api.returns('self', lambda value: value.id)
def create(self, vals_list):
# vals_list是一个列表数据,循环根据列表数据的内容创建数据,返回数据对象。
"""
....
"""

重写create方法可以实现我们想要的在创建前后做一些自己想要做的工作。

删 - unlink方法
def unlink(self):
# self是需要删除数据的对象。
"""
....
"""

重写unlink的方法,可以在删除数据的前后可以做一些自己的工作。

改 - write方法
def write(self, vals):
# self是需要修改数据的对象。
# vals是一个字典数据,key是需要修改的字段的名称,value是修改之后的值。
"""
....
"""

重写write的方法可以实现在对指定数据字段修改的时候的前后做出自己的动作。

查 - search方法
@api.model
@api.returns('self',
upgrade=lambda self, value, args, offset=0, limit=None, order=None, count=False: value if count else self.browse(value),
downgrade=lambda self, value, args, offset=0, limit=None, order=None, count=False: value if count else value.ids)
def search(self, args, offset=0, limit=None, order=None, count=False):
# agrs, 其实就是domain过滤条件。
# offset, 分页数据,多少号数据开始。
# limit, 数量量,offset和limit一起可以用来数据分页操作。
# count, 如果count=True,只会返回search到的数据的数量。
"""
....
"""

重写search()方法可以做到自由的在查询的时候做一些自己的操作。

总结
  • 其实重写这4个方法,在odoo的创建的时候肯定可以解决90%以上的问题。
  • 重点注意的就是api.mode的装饰器使用,如果基础方法使用了装饰器,那么重写的时候也一定要加上装饰器。

Odoo ORM Search家族

一个帮助odoo实现数据查询的家族

这个家族主要成员(常用的方法)

  • browse(self, ids=None)

    • 查询指定ids的数据。
    • 这里ids是一个列表,其实就是数据库数据的主键id数据的列表。
    • 返回:records对象集。
  • search(self, args, offset=0, limit=None, order=None, count=False)
    • 根据指定条件查询数据。
    • 上面有详细的用法。
    • 返回:records对象集。
  • search_count(self, args)
    • 查询数据个数。
    • args就是domain过滤方法。
    • 返回:int类型数量。
  • name_search(self, name='', args=None, operator='ilike', limit=100)
    • 获取数据的display_name集合。
    • 配合name_get使用,可以修改xml调用display_name的具体显示。
    • 返回:列表数据 [(id, displayname)...]。
  • name_get(self)
    • 根据self的对象内容返回 [(id, name), ...]
  • read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True)
    • 在数据分组的时候会使用,如果数据分组的时候需要做操作可以改写这个方法。
    • 返回:列表中嵌套字典的数据。

其他对象查询方法

  • read(self, fields=None, load='_classic_read')

    • 可以根据self的对象序列化数据返回。
    • fields, 一个列表数据,将要序列化的数据字段给写进入,默认是所有。
    • 返回:一个序列化数据 [{'字段名称': "字段值", ...}....]。
  • filtered(self, func)
    • 根据func的内容,进行对records对象进行过滤 列:lambda r: not r.id
    • 返回:records对象列表。
  • filtered_domain(self, domain)
    • 在records对象列表的基础之上进行再次过滤。
    • 返回:一个新的records的对象列表。
  • fields_get(self, allfields=None, attributes=None)
    • 获取field的具体内容描述,如果想在python field将字段readonly=True,重写这个方法就可以实现。

Odoo ORM Create家族

主要家族成员(常用方法)

  • create(self, vals_list)

    • 创建数据库数据,这里上上面已经详细讲解过了,这里就不做详细解释了。
  • name_create(self, name)
    • 通过_rec_name来创建record对象。
    • 调用create的方法,根据传参name的值到_rec_name进行创建数据。
    • 返回:name_get()的值或者False。
  • new(self, values={}, origin=None, ref=None)
    • 创建新的虚拟数据的方法。
    • 这个方法不会写入到数据库中,只会在缓存中创建数据。

其他create的的方法

  • copy(self, default=None)

    • copy数据,创建新的一条新的数据。
    • 返回一条新的recode。

Odoo ORM Write家族

  • update(self, values):

    • 更新数据values也是key value的方式一样。
  • write(self, vals)
    • 更新数据到数据库,update其实最后还是调用了write的方法进行更新数据。

Odoo ORM Unlink家族

  • unlink(self)

    • 删除数据,在上面也有详细讲解。

其他方法可能会用到

  • ensure_one(self)

    • 判断数据是否为只有一个,只要不是一个那么就会抛出异常。
  • exists(self)
    • 判断这个self对象是否存在。
  • view_init(self, fields_list)
    • 新建form视图的时候会走到这个方法。
  • load(self, fields, data)
    • 加载数据矩阵,导入数据的时候会加载这个方法。
  • default_get(self, fields_list)
    • 获取default的值。
    • 在创建form数据的时候会调用这个方法。
    • 这里还会调用view_init()的方法。
  • user_has_groups(self, groups)
    • 判断当前用户是否拥有指定groups组,返回True或False。
  • load_views(self, views, options=None)
    • 加载视图,通过传参views。
    • 配合_context可以针对不同的页面显示自己想要的视图。
  • fields_view_get(self, view_id=None, view_type='form', toolbar=False, submenu=False)
    • 控制视图的展示样式。
    • 这个方法重写可以根据自己的需求在代码中修改一些视图的信息。
    • 返回一个字典数据来控制视图。
  • get_formview_id(self, access_uid=None)
    • 根据record对象获取form视图的id。
  • get_formview_action(self, access_uid=None)
    • 获取form视图的action动作,用来渲染视图。
  • clear_caches(cls)
    • 清除缓存。
  • with_env(self, env)
    • 给自己的record的对象添加新的env。
  • sudo(self, flag=True)
    • 以superuser的方式返回对象。
  • with_user(self, user)
    • 以指定新的用户返回对象。
  • with_context(self, *args, **kwargs):
    • 给record的对象添加新的上下文。
  • sorted(self, key=None, reverse=False)
    • 按id进行排序record对象的内容。
  • flush(self, fnames=None, records=None)
    • 刷新数据,更新数据库的数据。
  • refresh(self):
    • 删除缓存数据。
  • recompute(self, fnames=None, records=None):
    • 重新计算指定字段的数据。
  • onchange(self, values, field_name, field_onchange)
    • 数据改动的时候触发的方法。

Odoo ORM研究2 - BaseModel中的常用方法分析的更多相关文章

  1. Odoo ORM研究1 - BaseModel中的类属性的作用

    概述 我们在写odoo项目的时候,经常继承model.Model来创建我们自己的ORM映射关系表. AbstractModel = BaseModel # 源码 class Model(Abstrac ...

  2. ORM研究3 - odoo fields常用的字段属性

    之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的一些通用属性字段的使用,学会它们可以为自己创建数据映射并使用有更好的帮助. 通用字段属 ...

  3. odoo ORM中的filed的关系映射的使用详解1

    前言 前面我们详细讲解了odoo ORM中fields中的常见属性的使用,根据不同的属性可以对字段进行不同的限制操作,比如readonly只读,store是否存储到数据库.今天我们继续研究ORM中的关 ...

  4. Java多线程中的常用方法

    本文将带你讲诉Java多线程中的常用方法   Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...

  5. Java实战之02Hibernate-03Session中的常用方法

    九.Session中的常用方法 1.save方法 都是临时态————>持久态 2.persist方法 作用: 持久化临时态对象. 与save方法的区别: 开始了事务:persist和save没有 ...

  6. javascript中数组常用方法总结

    原文:javascript中数组常用方法总结 在javascript的基础编程中,数组是我们最常遇到的,那么数组的一些常用方法也是我们必须要掌握的,下面我们总结一下数组中常用的方法. toString ...

  7. python中os常用方法

    python中OS常用方法 Python的标准库中的os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问 ...

  8. Java中的常用方法

    Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同    前缀 startsWith(String s).后缀 endsWit ...

  9. 研究下JavaScript中的Rest參数和參数默认值

    研究下JavaScript中的Rest參数和參数默认值 本文将讨论使 JavaScript 函数更有表现力的两个特性:Rest 參数和參数默认值. Rest 參数 通常,我们须要创建一个可变參数的函数 ...

随机推荐

  1. Structured Streaming编程 Programming Guide

    Structured Streaming编程 Programming Guide Overview Quick Example Programming Model Basic Concepts Han ...

  2. ADAS系统长篇综述(下)

    ADAS系统长篇综述(下) 四.ADAS架构设计的进化阶梯 前面谈到的产品的商业化推广渗透和产品的功能演进渗透,目的是让大家去概念化.当然,最后的赢家一定是实干者,能够在具体技术实现路径上进行深度耕耘 ...

  3. 孟老板 BaseAdapter封装 (一) 简单封装

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  4. Django框架之路由层汇总

    一 Django中路由的作用 URL配置(URLconf)就像Django 所支撑网站的目录.它的本质是URL与要为该URL调用的视图函数之间的映射表:你就是以这种方式告诉Django,对于客户端发来 ...

  5. redis 记一次搭建高可用redis集群过程,问题解决;Node 192.168.184.133:8001 is not configured as a cluster node

    ------------恢复内容开始------------ 步骤 1:每台redis服务器启动之后,需要将这几台redis关联起来, 2: 关联命令启动之后 报错: Node 192.168.184 ...

  6. 1、java数据结构和算法---循环队列

    直接上代码: public class CircleArrayQueueLvcai { private int[] array; private int maxSize;//循环队列大小 privat ...

  7. APP的闪退和无响应

    1.app闪退(crash,崩溃):程序异常退出不再运行 闪退的原因: a.程序内部逻辑错误(因算法或网络连接引起的异常,或是为捕捉到的错误) b.系统自身异常:一般自定ROM或刷机后比较常见 c.运 ...

  8. Nginx 配置文件介绍

    目录 1.1 常用命令 1.2 Nginx的配置文件结构 1.3 Nginx的全局配置 1.4 HTTP服务器配置 1.5 HttpGzip配置 1.6 负载均衡配置 1.7 server虚拟主机配置 ...

  9. WPF 后台代码做 TranslateTransform 的动画

    本文告诉大家,在后台代码,对 TranslateTransform 做动画的方法 今天小伙伴问我一个问题,说为什么相同的代码,如果设置到按钮上,是可以让按钮的某个属性变更,但是如果设置给 Transl ...

  10. 深入理解Faiss 原理&源码 (一) 编译

    目录 深入理解Faiss 原理&源码 (一) 编译 mac下安装 安装mac xcode工具包 安装 openblas 安装swig 安装libomp 编译faiss 附录 深入理解Faiss ...