odoo 二次开发的一些原理
一:self是什么
目前新版的Odoo中使用到的self,是对 游标cr、用户ID、模型、上下文、记录集、缓存 的封装。
我们可以通过 self.XX 获取到这些封装的东西,比如:self.cr、self.uid。
二:通过直接设置属性来改变数据库中字段值
我们在查出某模型的记录后,可以通过 record.XX = value 来直接修改记录的字段内容。
同样,在重写模型的write方法中,也可以通过 self.XX = value 来指定新增记录中某字段的值。
这里需要注意两点:
1:修改查出来的记录字段值来改变数据库内容,是通过改变缓存中的值出发数据库写记录来达到的。
2:重写write方法时,在write方法中每调用一次 self.XX = value 语句,都会触发数据库写操作,因此一般采用:
for rec in self:
rec.XX = XX
的写法。
三:环境
1:操作缓存
环境储存了模型的缓存记录集,因此我们可以通过环境来获取、增加、修改、删除记录,而触发数据库更改,从而达到操作数据库的目的。
例如:新增一条记录
self.env['模型'].create(vals)
2:改变用户权限
我们可以通过self.sudo()获得超级权限,从而确保我们的操作能够进行。
self.env[‘model'].sudo().create(vals)
3:访问当前用户
self.env.user
4:获取XML的ID
self.env.ref('external id')
5:更新缓存,触发数据库操作
self.env.invalidate_all()
四:self常用接口
1:普通查询:返回记录集,后续通过修改记录值来触发数据库修改
self.search(domain) //从当前模型的self中查询
self.env['model'].search(domain) // 获取某个model的环境,查询其中的记录集
2:只读查询:返回列表,只能提取内容,不能触发数据库修改
self.search_read([],['要查询的字段'])
3:统计数量:返回符合条件的记录条数
self.search_count(domain)
4:浏览:通过一系列id值,返回对应的记录集
self.browse([id])
5:删除
self.unlink(domain)
五:NEW ids
Odoo在创建一个新记录时,会使用models.ids虚拟一个记录id。
可以通过
if is instance(record.id,models.NewId):
来判断。
六、数据库查询
- import psycopg2
- class XXXXX(models.Model):
- ........
- @api.multi
- def OOOO(self):
- db = psycopg2.connect("dbname=test4 user=postgres")#查找名叫 test4 的数据库 postgres 是数据库的超级用户名称
- vals = db.cursor()
- vals.execute("SELECT sales,prices,sale_date FROM run_chart")#执行sql语句查询数据
- tables = vals.fetchall()#返回查询结果
- #或者
- sql = "select *from 表名"
- self.env.cr.execute(sql) #执行SQL语句
- dicts = self.env.cr.dictfetchall() #获取SQL的查询结果
odoo 二次开发的一些原理的更多相关文章
- Odoo 二次开发教程【一】 Odoo 的安装
一,安装的两种方式: 1) deb包安装: 此安装方式适用于简单不需要太多的人工干预,大多数插件都在deb中涵盖了.具体的步骤如下: 1.编辑 /etc/apt/source.list 文件,在末尾添 ...
- Odoo 二次开发教程(五)-新API的介绍与应用
[关于odoo新API的介绍,Internet上资料很少,或者不够完整详实,这会对初学者造成很大的困惑,本篇的目的就是希望能帮助新手了解新API的大概] odoo 新api的实现是借助于python装 ...
- Odoo 二次开发教程(四)-只读、唯一性验证和ORM方法介绍
一.只读和唯一性验证 只读的设置有两种方法,一种是实在字段定义时设置为只读,第二种是在页面视图中进行设置. 接前例,我们将学生(tech.student)的名字name字段设置成只读. 方法一:字段定 ...
- Odoo 二次开发教程(三)-第一个Model及Form、Tree视图
创建完我们的模块,接下来我们就要为我们的模块添加一些对象.今天我们将要创建一个学生对象(tech.student)和一些基本的属性,并将用form和tree视图将其展示出来: 一. 创建tech.st ...
- Odoo 二次开发教程(二)-模块的基础构建
注:本篇及后续均以8.0为基础. 一. Odoo模块的构成 __init__.py 文件是python包导入所必须的文件,内容可以为空,通常情况下我们用来导入自己写的py文件. __openerp__ ...
- odoo 二次开发的方法
介绍 二开时模型创建完毕并配好视图后对于基本的CRUD操作不需要再在代码中实现,框架会自动提供这些功能,但如果我们的开发需求不仅仅是对当前对象的CRUD时,就需要在框架原来方法的基础上扩展出一些自己所 ...
- odoo 二次开发小记-----不定时更新
一.odoo中 页面上字段变化引起其他字段范围变化-onchange @api.onchange('company_id') def onchange_parent_id(self): return ...
- Odoo二次开发
Odoo 点击进入
- odoo二次开发 tips
1.model属性 每个对象(即class)一般由字段(变量)和函数组成,每个对象对应着数据库中的一张表,驼峰命名方式 models.Model 基础模块,会根据字段和模型名在后台数据库生成对应得表文 ...
随机推荐
- 取得MapReduce的Thread Dump
====2016/5/20: 经过上级指示,为了MR性能调优,需要截取MR的服务器的线程堆栈(Thread Dump) 战友介绍的方法是这样的: ①.使用ps命令[ps -ef | grep java ...
- Matlab中的数据预处理-归一化(mapminmax)与标准化(mapstd)
一.mapminmax 意思是将矩阵的每一行处理成[-1,1]区间,此时对于模式识别或者其他统计学来说,数据应该是每一列是一个样本,每一行是多个样本的同一维,即对于一个M*N的矩阵来说,样本的维度是M ...
- 【转】ConcurrentMap 分析和思考
预备知识:Java HashMap and HashSet 的实现机制 由预备知识可以知道hashmap 的存储结构为: (图像来自http://www.ibm.com/developerworks/ ...
- 白盒测试实践--Day4 12.20
累计完成任务情况: 阶段内容 参与人 完成个人情况说明并提交作业 全体 汇总作业,查漏补缺,完成代码测试总结 小靳.小龙 完成测试小结 小黄.小尹 完成静态代码检查结果报告 小靳 完成JUnit脚本编 ...
- block functions区块函数插件的定义与使用
在插件目录plugins里新建文件 block.插件名.php文件(如 block.插件名.php) 例:block.test2.php <?php function smarty_block_ ...
- CentOS7 下 安装 supervisor
[注] linux环境必须安装 python 1.获取supervisor包:[https://pypi.python.org/pypi/supervisor] # wget https://pypi ...
- 编写高质量代码改善C#程序的157个建议——建议76: 警惕线程的优先级
建议76: 警惕线程的优先级 线程在C#中有5个优先级:Highest.AboveNormal.Normal.BelowNormal和Lowest.讲到线程的优先级,就会涉及线程的调度.Windows ...
- 所有中心对称五字母域名生成,扫了一下,com的基本上都被注册了。。。
public static void main(String[] args) { String[] letter = new String[]{"i","m", ...
- c# winform实现同时只允许账号在一台电脑登录的功能
公司有个小需求,要求账号不能同时登录在多台电脑上,就像那个微信或QQ一样,如果一台电脑登录了,原来登录的就自动退出了(网上搜索点单点登录,发现有些出入,人家是实现一次登录在多个系统间认证的) 找了些资 ...
- 「HNOI 2015」菜肴制作
题目链接 戳我 \(Description\) 有若干限制,需要求一个\(1\)到\(n\)的排列,每个限制\((x,y)\)表示\(x\)必须在\(j\)之前,并要求所求的排列满足所有限制并让\(1 ...