odoo 二次開發的一些原理


 

 

一: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):

    來判斷。

  六、數據庫查詢

  1.  
    import psycopg2
  2.  
     
  3.  
    class XXXXX(models.Model):
  4.  
    ........
  5.  
     
  6.  
    @api.multi
  7.  
    def OOOO(self):
  8.  
    db = psycopg2.connect( "dbname=test4 user=postgres")#查找名叫 test4 的數據庫 postgres 是數據庫的超級用戶名稱
  9.  
    vals = db.cursor()
  10.  
    vals.execute( "SELECT sales,prices,sale_date FROM run_chart")#執行sql語句查詢數據
  11.  
    tables = vals.fetchall() #返回查詢結果
  12.  
     
  13.  
    #或者
  14.  
    sql = "select *from 表名"
  15.  
    self.env.cr.execute(sql) #執行SQL語句
  16.  
    dicts = self.env.cr.dictfetchall() #獲取SQL的查詢結果

     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM