ODOO 通過 .env進(jìn)行數(shù)據(jù)庫操作的常見場景

Environment 是 odoo 中操作db的總句柄,以下幾種方式可以獲得:

  1. 可以直接通過self.env得到 Environment
  2. 在請求的 Controller 可以通過 request.env()得到 Environment
  3. 通過模型類或模型類對象獲取,cls.env、product.env
    列舉一些常用上下文參數(shù):
   #當(dāng)前用戶
    self.env.user 
   #當(dāng)前用戶id
    self.env.uid```
   #當(dāng)前語言代碼
    self.env.lang
   #當(dāng)前數(shù)據(jù)庫連接
    self.env.cr
    #利用 env[model] 獲取模型類對象
    self.env['ir.model'].search([('state',  '!=',  'manual')])
    #利用 env.cr 執(zhí)行sql語句
     self.env.cr.execute(query,  (value,))

self是什么**

目前新版的Odoo中使用到的self,是對 游標(biāo)cr、用戶ID、模型、上下文、記錄集、緩存 的封裝。

我們可以通過 self.XX 獲取到這些封裝的東西,比如:self.cr、self.uid。

通過直接設(shè)置屬性來改變數(shù)據(jù)庫中字段值**

我們在查出某模型的記錄后,可以通過 record.XX = value 來直接修改記錄的字段內(nèi)容。

同樣,在重寫模型的write方法中,也可以通過 self.XX = value 來指定新增記錄中某字段的值。

這里需要注意兩點(diǎn):

1:修改查出來的記錄字段值來改變數(shù)據(jù)庫內(nèi)容,是通過改變緩存中的值觸發(fā)數(shù)據(jù)庫寫記錄來達(dá)到的。

2:重寫write方法時,在write方法中每調(diào)用一次 self.XX = value 語句,都會觸發(fā)數(shù)據(jù)庫寫操作,因此一般采用如下寫法:

 for rec in  self:
     rec.XX = XX

env 常見操作

操作緩存

環(huán)境儲存了模型的緩存記錄集,因此我們可以通過環(huán)境來獲取、增加、修改、刪除記錄,而觸發(fā)數(shù)據(jù)庫更改,從而達(dá)到操作數(shù)據(jù)庫的目的。

#新增一條記錄
self.env['模型'].create(vals)

#改變用戶權(quán)限
#我們可以通過self.sudo()獲得超級權(quán)限,從而確保我們的操作能夠進(jìn)行。
self.env[‘model'].sudo().create(vals)

#訪問當(dāng)前用戶
self.env.user

#獲取XML的ID
self.env.ref('external id')

#更新緩存,觸發(fā)數(shù)據(jù)庫操作
self.env.invalidate_all()

self常用接口

#普通查詢:返回記錄集,后續(xù)通過修改記錄值來觸發(fā)數(shù)據(jù)庫修改
self.search(domain)  #從當(dāng)前模型的self中查詢
self.env['model'].search(domain)  #獲取某個model的環(huán)境,查詢其中的記錄集


#只讀查詢:返回列表,只能提取內(nèi)容,不能觸發(fā)數(shù)據(jù)庫修改
self.search_read([],['要查詢的字段'])

#統(tǒng)計數(shù)量:返回符合條件的記錄條數(shù)
self.search_count(domain)

#瀏覽:通過一系列id值,返回對應(yīng)的記錄集
self.browse([id])

#刪除
self.unlink(domain)

新記錄查詢 NEW ids

Odoo在創(chuàng)建一個新記錄時,會使用models.ids虛擬一個記錄id。可以通過如下語句來判斷是否新記錄:

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

數(shù)據(jù)庫查詢

## 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)  #執(zhí)行SQL語句
     dicts =  self.env.cr.dictfetchall()  #獲取SQL的查詢結(jié)果
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容