zoukankan      html  css  js  c++  java
  • odoo开发笔记 -- self详解

    python中一切皆对象!

    odoo基于python开发,那么odoo中也可以理解成一切皆对象。

    我们在python中定义类的时候,一般会用到self,用来表示当前对象自己。

    那么odoo中的self除了python语法中,自带的用法,还有哪些特殊的用法呢?

    一: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的查询结果
  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/hellojesson/p/9981531.html
Copyright © 2011-2022 走看看