一:self是什么sql
目前新版的Odoo中使用到的self,是对 游标cr、用户ID、模型、上下文、记录集、缓存 的封装。数据库
咱们能够经过 self.XX 获取到这些封装的东西,好比:self.cr、self.uid。api
二:经过直接设置属性来改变数据库中字段值缓存
咱们在查出某模型的记录后,能够经过 record.XX = value 来直接修改记录的字段内容。dom
一样,在重写模型的write方法中,也能够经过 self.XX = value 来指定新增记录中某字段的值。post
这里须要注意两点:fetch
1:修改查出来的记录字段值来改变数据库内容,是经过改变缓存中的值出发数据库写记录来达到的。ui
2:重写write方法时,在write方法中每调用一次 self.XX = value 语句,都会触发数据库写操做,所以通常采用:spa
for rec in self: rec.XX = XX
的写法。code
三:环境
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):
来判断。
6、数据库查询
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的查询结果