一: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):

来判断。

  六、数据库查询

  1.  
    import psycopg2
  2.  
     
  3.  
    class XXXXX(models.Model):
  4.  
    ........
  5.  
     
  6.  
    @api.multi
  7.  
    def OOOO(self):
  8.  
    db = psycopg2.connect("dbname=test4 user=postgres")#查找名叫 test4 的数据库 postgres 是数据库的超级用户名称
  9.  
    vals = db.cursor()
  10.  
    vals.execute("SELECT sales,prices,sale_date FROM run_chart")#执行sql语句查询数据
  11.  
    tables = vals.fetchall()#返回查询结果
  12.  
     
  13.  
    #或者
  14.  
    sql = "select *from 表名"
  15.  
    self.env.cr.execute(sql) #执行SQL语句
  16.  
    dicts = self.env.cr.dictfetchall() #获取SQL的查询结果

odoo 二次开发的一些原理的更多相关文章

  1. Odoo 二次开发教程【一】 Odoo 的安装

    一,安装的两种方式: 1) deb包安装: 此安装方式适用于简单不需要太多的人工干预,大多数插件都在deb中涵盖了.具体的步骤如下: 1.编辑 /etc/apt/source.list 文件,在末尾添 ...

  2. Odoo 二次开发教程(五)-新API的介绍与应用

    [关于odoo新API的介绍,Internet上资料很少,或者不够完整详实,这会对初学者造成很大的困惑,本篇的目的就是希望能帮助新手了解新API的大概] odoo 新api的实现是借助于python装 ...

  3. Odoo 二次开发教程(四)-只读、唯一性验证和ORM方法介绍

    一.只读和唯一性验证 只读的设置有两种方法,一种是实在字段定义时设置为只读,第二种是在页面视图中进行设置. 接前例,我们将学生(tech.student)的名字name字段设置成只读. 方法一:字段定 ...

  4. Odoo 二次开发教程(三)-第一个Model及Form、Tree视图

    创建完我们的模块,接下来我们就要为我们的模块添加一些对象.今天我们将要创建一个学生对象(tech.student)和一些基本的属性,并将用form和tree视图将其展示出来: 一. 创建tech.st ...

  5. Odoo 二次开发教程(二)-模块的基础构建

    注:本篇及后续均以8.0为基础. 一. Odoo模块的构成 __init__.py 文件是python包导入所必须的文件,内容可以为空,通常情况下我们用来导入自己写的py文件. __openerp__ ...

  6. odoo 二次开发的方法

    介绍 二开时模型创建完毕并配好视图后对于基本的CRUD操作不需要再在代码中实现,框架会自动提供这些功能,但如果我们的开发需求不仅仅是对当前对象的CRUD时,就需要在框架原来方法的基础上扩展出一些自己所 ...

  7. odoo 二次开发小记-----不定时更新

    一.odoo中 页面上字段变化引起其他字段范围变化-onchange @api.onchange('company_id') def onchange_parent_id(self): return ...

  8. Odoo二次开发

    Odoo 点击进入

  9. odoo二次开发 tips

    1.model属性 每个对象(即class)一般由字段(变量)和函数组成,每个对象对应着数据库中的一张表,驼峰命名方式 models.Model 基础模块,会根据字段和模型名在后台数据库生成对应得表文 ...

随机推荐

  1. HUST软测1504班第4周小组作业成绩:WordCount优化

    说明 本次公布的成绩为第四周作业的结果: 第4周小组作业:WordCount优化 博客推荐:本次作业有一位同学完成有创意,推荐优秀博客.(优秀博客不会对成绩带来正面或者负面影响)PS:做任何创新的任务 ...

  2. MySQL 存储过程 -流程控制的使用

    #五.流程控制的使用 #1.IF 使用 create PROCEDURE iftest1() BEGIN DECLARE a int DEFAULT 10; -- IF (a>1 &&a ...

  3. Android 文字垂直居中

    android中自定义控件,自己绘制文字canvas.drawText()的时候,怎样才能让文字垂直居中那? drawText()的方法说明 也就是使用paint画笔在(X,Y)处进行绘制,X为横向坐 ...

  4. 金牌选手zzy的卡常头文件

    一定要粘上去啊,亲测快两倍 #pragma GCC diagnostic error "-std=c++11" #pragma GCC optimize("-fdelet ...

  5. [LeetCode 题解]: pow(x,n)

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Implement po ...

  6. RobotFramework与Jenkins集成发送邮件

    转: A.    目标:实现RobotFramework的脚本定时自动执行,执行完后自动将结果发送到指定邮箱 B.    前提1. 配置好Robot Framework的环境,脚本可以正常运行 2. ...

  7. js ~或者~~

    问题:~是什么意思? 答:js中是对数字取反 var a = null; var b = '23' console.log(~~null) console.log(~~b)

  8. c# 判断两个集合是否有交集

    /// <summary> /// 判断是否有交集 /// </summary> /// <typeparam name="T"></ty ...

  9. Android 开发权限设置中英对照说明详解

    android.permission.ACCESS_CHECKIN_PROPERTIES 允许读写访问 "properties"表在checkin数据库中,改值可以修改上传( Al ...

  10. jQuery find()方法 eq()方法

    find() 使用: 返回 <ul> 后代中所有的 <span> 元素: $(document).ready(function(){$("ul").find ...