美文网首页odoo
ODOO 通过 .env进行数据库操作的常见场景

ODOO 通过 .env进行数据库操作的常见场景

作者: 豪威Howie | 来源:发表于2022-08-28 09:41 被阅读0次

    Environment 是 odoo 中操作db的总句柄,以下几种方式可以获得:

    1. 可以直接通过self.env得到 Environment
    2. 在请求的 Controller 可以通过 request.env()得到 Environment
    3. 通过模型类或模型类对象获取,cls.envproduct.env
      列举一些常用上下文参数:
       #当前用户
        self.env.user 
       #当前用户id
        self.env.uid```
       #当前语言代码
        self.env.lang
       #当前数据库连接
        self.env.cr
        #利用 env[model] 获取模型类对象
        self.env['ir.model'].search([('state',  '!=',  'manual')])
        #利用 env.cr 执行sql语句
         self.env.cr.execute(query,  (value,))
    

    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
    

    env 常见操作

    操作缓存

    环境储存了模型的缓存记录集,因此我们可以通过环境来获取、增加、修改、删除记录,而触发数据库更改,从而达到操作数据库的目的。

    #新增一条记录
    self.env['模型'].create(vals)
    
    #改变用户权限
    #我们可以通过self.sudo()获得超级权限,从而确保我们的操作能够进行。
    self.env[‘model'].sudo().create(vals)
    
    #访问当前用户
    self.env.user
    
    #获取XML的ID
    self.env.ref('external id')
    
    #更新缓存,触发数据库操作
    self.env.invalidate_all()
    

    self常用接口

    #普通查询:返回记录集,后续通过修改记录值来触发数据库修改
    self.search(domain)  #从当前模型的self中查询
    self.env['model'].search(domain)  #获取某个model的环境,查询其中的记录集
    
    
    #只读查询:返回列表,只能提取内容,不能触发数据库修改
    self.search_read([],['要查询的字段'])
    
    #统计数量:返回符合条件的记录条数
    self.search_count(domain)
    
    #浏览:通过一系列id值,返回对应的记录集
    self.browse([id])
    
    #删除
    self.unlink(domain)
    

    新记录查询 NEW ids

    Odoo在创建一个新记录时,会使用models.ids虚拟一个记录id。可以通过如下语句来判断是否新记录:

    if  is instance(record.id,models.NewId):
    

    数据库查询

    ## python方式
    import psycopg2
        class XXXXX(models.Model):     
        @api.multi
        def OOOO(self):
          db = psycopg2.connect("dbname=dbname user=dbuser")
         vals = db.cursor()
         sql="SELECT sales,prices,sale_date FROM run_chart"
         vals.execute(sql)
         tables = vals.fetchall()
    

    或者

    #odoo
          sql =  "select *from 表名"
          self.env.cr.execute(sql)  #执行SQL语句
         dicts =  self.env.cr.dictfetchall()  #获取SQL的查询结果
    

    相关文章

      网友评论

        本文标题:ODOO 通过 .env进行数据库操作的常见场景

        本文链接:https://www.haomeiwen.com/subject/xwvqnrtx.html