1. 程式人生 > >odoo開發筆記 -- self詳解

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