一: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的查詢結果