Odoo ORM研究2 - BaseModel中的常用方法分析
今天继续研究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对象列表。
- 根据func的内容,进行对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中的常用方法分析的更多相关文章
- Odoo ORM研究1 - BaseModel中的类属性的作用
概述 我们在写odoo项目的时候,经常继承model.Model来创建我们自己的ORM映射关系表. AbstractModel = BaseModel # 源码 class Model(Abstrac ...
- ORM研究3 - odoo fields常用的字段属性
之前我们已经讲解了odoo ORM中的一些对字段常用的API操作方法,今天我们继续研究一下Odoo orm中字段的一些通用属性字段的使用,学会它们可以为自己创建数据映射并使用有更好的帮助. 通用字段属 ...
- odoo ORM中的filed的关系映射的使用详解1
前言 前面我们详细讲解了odoo ORM中fields中的常见属性的使用,根据不同的属性可以对字段进行不同的限制操作,比如readonly只读,store是否存储到数据库.今天我们继续研究ORM中的关 ...
- Java多线程中的常用方法
本文将带你讲诉Java多线程中的常用方法 Java多线程中的常用方法有如下几个 start,run,sleep,wait,notify,notifyAll,join,isAlive,current ...
- Java实战之02Hibernate-03Session中的常用方法
九.Session中的常用方法 1.save方法 都是临时态————>持久态 2.persist方法 作用: 持久化临时态对象. 与save方法的区别: 开始了事务:persist和save没有 ...
- javascript中数组常用方法总结
原文:javascript中数组常用方法总结 在javascript的基础编程中,数组是我们最常遇到的,那么数组的一些常用方法也是我们必须要掌握的,下面我们总结一下数组中常用的方法. toString ...
- python中os常用方法
python中OS常用方法 Python的标准库中的os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.即它允许一个程序在编写后不需要任何改动,也不会发生任何问 ...
- Java中的常用方法
Java中的常用方法 第一章 字符串 1.获取字符串的长度:length() 2.判断字符串的前缀或后缀与已知字符串是否相同 前缀 startsWith(String s).后缀 endsWit ...
- 研究下JavaScript中的Rest參数和參数默认值
研究下JavaScript中的Rest參数和參数默认值 本文将讨论使 JavaScript 函数更有表现力的两个特性:Rest 參数和參数默认值. Rest 參数 通常,我们须要创建一个可变參数的函数 ...
随机推荐
- BTC芯片介绍
BTC芯片介绍 Innosilicon宣布全球第一和最佳的28nm比特币ASIC和参考矿机 A1Craft(也称为A1)是2013年世界上最好的BTC ASIC,这是比特币区块哈希算法的易于使用,定制 ...
- 多目标跟踪:CVPR2019论文阅读
多目标跟踪:CVPR2019论文阅读 Robust Multi-Modality Multi-Object Tracking 论文链接:https://arxiv.org/abs/1909.0385 ...
- C#中关于Cookie的理解
本文链接出自:https://www.cnblogs.com/xiangzhe-C/p/4230042.html 1.Cookie简介 Cookie 提供了一种在 Web 应用程序中存储用户特定信息的 ...
- 读HikariCP源码学Java(二)—— 因地制宜的改装版ArrayList:FastList
前言 如前文所述,HikariCP为了提高性能不遗余力,其中一个比较特别的优化是它没有直接使用ArrayList,而是自己实现了FastList,因地制宜,让数组的读写性能都有了一定程度的提高. 构造 ...
- C语言const关键字的作用
1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <string.h> 4 #include ...
- 基于Docker安装常用软件
基于Docker安装常用软件 本实验介绍如何基于Docker安装常用的软件,具体包括: Ubuntu Cetnos Nginx Node.js PHP MySQL Tomcat Redis Mongo ...
- Luatools v2烧录教程(适用于2G、4G Cat.1、4G Cat.4模块)
目录,可以根据需要直接点击跳转: 下载LuaTools工具 2G模块烧写教程(Air2xx系列.Air8xx系列) 连接模块 刷入AT版本的lod 刷入任意的lod固件 下载lua脚本文件 [4G 模 ...
- Duilib的双缓冲实现,附带GDI、WTL的双缓冲实现
前言: 闪烁问题,之前的经验是使用双缓冲,借此机会,把双缓冲的研究心得总结下. 双缓冲的含义: 缓冲这个词,相信大家都不陌生,Cache.主要是为了解决上下游(或者模块.或者系统)等性能不匹配问题.如 ...
- Python3中最常用的5种线程锁你会用吗
前言 本章节将继续围绕threading模块讲解,基本上是纯理论偏多. 对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题. 官方文档 线程安全 线程安 ...
- vscode 配置 Pug Compile Hero Pro 插件步骤
这个随笔主要介绍 vscode 配置 Pug Compile Hero Pro 插件的步骤,实现快速使用less 以及 scss 等的编程语言 第一步 当然是安装我们的插件啦! 在插件商店里 搜 Sa ...