一、只讀和唯一性驗證
只讀的設置有兩種方法,一種是實在字段定義時設置為只讀,第二種是在頁面視圖中進行設置。
接前例,我們將學生(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,更多介紹請戳這里
