Odoo 二次開發教程(四)-只讀、唯一性驗證和ORM方法介紹


一、只讀和唯一性驗證

只讀的設置有兩種方法,一種是實在字段定義時設置為只讀,第二種是在頁面視圖中進行設置。

接前例,我們將學生(tech.student)的名字name字段設置成只讀。

方法一:字段定義添加只讀設置

方法二:視圖上加只讀設置

重啟服務,升級模塊,即可看到我們的修改生效了。

提示:修改了python代碼(非字段內容)只需重啟服務,修改了視圖文件需要升級模塊。 

 

唯一性的驗證也有兩種方法,一種是利用_sql_constraint另一種是利用API的contraints裝飾器。

方法一:利用_sql_contraints

我們為我們的student對象添加要給學號字段,並設置成唯一的:

_sql_contraints 的格式為:[(限制名稱,限制條件,警告信息)],名稱可以隨便起,保證其唯一性即可,限制條件為postgresql的限制語句,常見的有UNIQUE\CHECK\PRIMERY KEY等等,具體請參考POSTGRESQL手冊。添加完_sql_contraints之后需要重啟服務,升級模塊。當我們輸入了重復的學員編號時會彈出提示:

注意:如果添加_sql_contraints前已經存在相同數據的字段,則_sql_contraints是添加不上的,因此也不會有提示出現。

方法二:@api.contrains

這次我們來驗證學員名字,如果有重復的名字則彈出提示。 

我們創建一個名字為張三的學員:

再次創建一個名字為張三的學員:

可以看出已經存在名字為張三的學員,這樣就完成了對某個字段你的限制。

以上兩種方法的區別在於:_sql_contraints是從數據庫層面對數據進行唯一性的驗證,而@api.contraints是在代碼層面進行檢查。_sql_contraints的效率更高,@api.contraints的靈活性更好。

二、ORM方法簡介

可能有同學已經注意到了上面例子中的self.search方法,下面我們就來具體介紹一下orm的幾種基本方法(v8版本):

1. browse(ids)

作用:獲取指定記錄的對象。

參數:記錄值的ids,

返回值:對象列表。

browse方法其實在v7版本中應用的更多,因為v7版本的search等方法的返回值是ids,而v8版本中的返回值已經是目標對象的列表了,因此也就不需要再次調用browse方法。

例子:

sale_order = self.env['sale.order'].browse(1) #獲取數據庫中id為1的銷售訂單。

2. search(domain)

作用:搜索指定domain的記錄集

參數:搜索domain [()]

返回值:符合搜索結果的對象列表.

例子:

students = self.search[('name','=',self.name)]

查找所有與當前對象名字相同的學員。

關於domain的解釋,請參考本博客的這篇文章

3.create(val)

作用:創建對象

參數:要創建的對象字典

返回值:新創建的對象

例子:

student = self.create({
   'name':'張三', 
   'age':26,
   'sex':'m',
   'sno':'0003',
})

這樣就創建了一個新的學員

4. write(val)

作用:修改對象

參數:需要修改參數的字典

返回值:True or False

5.unlink()

作用:刪除記錄

例子:

self.unlink()

對於v7版本 同樣是以上的五種方法,只不過每種方法都需要添加cr,uid,ids,context等幾個參數,v7方法本文不做過多介紹,需要的同學請看這里

 

env是環境變量,可以借助此變量獲取odoo中的任一對象,舉例來說,如果我想要獲取銷售訂單對象,我就可以使用如下的寫法:

self.env['sale.order']

v7版本中是pool對象:

self.poo.get('sale.order')

另外,如果想要獲取當前登錄對象可以使用self.env.user,更多介紹請戳這里

 


免責聲明!

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



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