Environment 是 odoo 中操作db的總句柄,以下幾種方式可以獲得:
- 可以直接通過
self.env得到 Environment - 在請求的 Controller 可以通過
request.env()得到 Environment - 通過模型類或模型類對象獲取,
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é)果