羅列一些Odoo中的欄位屬性,基本包含大部分的屬性。
常用欄位屬性
平平無奇常用欄位屬性
string:欄位的標題,在UI檢視標籤中使用。它是可選項,如未設定,會通過首字母大寫及將空格替換成為下劃線來從欄位名獲取標籤。
required:強制欄位在使用者介面中必填,預設為False。
readonly:讓該欄位在使用者介面為只讀,預設為False。
index:在設定為True時,為該欄位建立一個資料庫索引,有時可供更快搜尋使用。
help:在UI提示工具中顯示的解釋性文字。
groups:讓欄位僅對安全組可見。它是一個包含安全組的XML ID逗號分隔列表的一個字串。
store:讓計算欄位等原本不儲存的資料儲存在資料庫中,設定這個可以使計算欄位可被搜尋。
copy:標識在複製記錄時是否拷貝欄位值。對於非關係型欄位和Many2one它的預設值是True,對One2many和計算欄位它的值為False。
default
預設值,也可以是一個用於計算預設值的函式,例如default=_compute_default, _compute_default是模型中定義在欄位前一個的方法。
related
關聯屬性,將相關的欄位變成關聯欄位來訪問值;
publisher_id = fields.Many2one("res.partner", string="Publisher", ondelete="set null", index=True) publisher_city = fields.Char(string="Publisher City", related="publisher_id.city")
關聯欄位實際上是計算欄位。它們僅提供⼀種⽅便的快捷語法來從關聯模型讀取欄位值。作為⼀個計算欄位,這意味著也可以使⽤store屬性。
states
states允許使用者介面依據state欄位的值來動態設定readonly,required和invisible的值。因此,它要求存在一個state欄位並在表單檢視中使用(即使是隱藏的)。state屬性的名稱是在odoo硬編碼且無法修改的。
compute
計算欄位,預設為只讀,需要定義一個函式以根據情況動態的生成該欄位的值。並且該欄位預設不能被搜尋到。
計算欄位在運⾏時動態計算,預設儲存,可設定store=True將計算欄位儲存在資料庫,並且此時可被搜尋到;ORM使⽤快取來避免在每次訪問值時的低效重計算。它使⽤@depends裝飾器來監測快取值何時應置為⽆效並重新計算,因此, 它需要知道所依賴的其它欄位。
date_release = fields.Date(string="Release Date") # 計算欄位,及讓計算欄位可編輯和可搜尋 age_days = fields.Float(string="Days Since Release", compute="_compute_age", inverse="_inverse_age", search="_search_age", store=False, compute_sudo=False) # compute_sudo 用於需要提權來執行計算的情況 # 值計算邏輯的方法 @api.depends("date_release") def _compute_age(self): today = fields.Date.today() for book in self.filtered("date_release"): # 篩選有 date_release 的書籍 delta = today - book.date_release book.age_days = delta.days
關於計算欄位的可編輯與可搜尋可檢視我的另一篇文章:odoo之技巧集合一-計算欄位的可編輯與可搜尋
ondelete
關聯刪除屬性,決定在關聯記錄刪除時執行什麼操作。預設值為"set null",所有值如下:
- "set null":會將該欄位置為空值;
- "restrice":會阻止關聯欄位記錄的刪除;
- "cascade":導致關聯的記錄同樣被刪除;
示例:
partner_id = fields.Many2one("res.partner", ondelete="cascade")
context
上下文屬性,context對關聯欄位有效,在點選欄位進入關聯檢視時context會向客戶端上下文新增變數。例如,我們可以使用它來為新紀錄設定通過該檢視建立的預設值。
domain
過濾屬性,對關聯欄位有效,用來限制可用的關聯記錄列表的搜尋過濾器。
示例:
category_id = fields.Many2one("library.book.category", string="Category", domain=[('id', 'in', ['4', '5', '6'])])
digits
用於Float欄位並設定該欄位的精度值,精度由總位數和小數位數對來定義。
length = fields.Float(string="長度", digits=(8, 3))。# 總長度為8位,小數位佔3位
關聯欄位屬性
共有屬性
comodel_name
目標模型識別符號,對所有關聯欄位強制使用,可以佔位定義而無需使用關鍵字;
One2many,Many2many
limit
它在One2many和Many2many中使用,對在使用者介面級別上用於記錄讀取的數量這是可選限制;當設定後,最多隻能新增和顯示n條資料。
author_ids = fields.Many2many("res.partner", string="Authors", limit=10)
One2many
inverse_name
它僅應用於One2many,是反向Many2one關聯的目標模型中的欄位名;
Many2many
- relation:用於Many2many欄位。many2many關聯表的名稱預設使用兩個關聯模型名按字母排序加上一個_rel字尾來建立。但我們可以使用relation屬性來進行覆蓋。
- column1:這是連線這個模型的關聯表中的Many2one欄位的名稱
- column2:這是在關聯資料表中連線comodel的Many2one欄位的名稱
其他欄位屬性
其他較少使用的欄位
translate
在設定為True時,讓欄位可翻譯,它可根據使用者的介面語言保持不同值。
company_dependent
讓該欄位根據公司儲存不同值。
strip_style
和sanitize配合使用,見下個屬性。
sanitize
用於Html欄位並去除包含不安全標籤的內容。使用它會對輸入進行全域性清理。如果需要更精細的控制,可以使用一些關鍵字,僅在啟用sanitize時生效。
- sanitize_tags=True刪除⽩名單列表以外的標籤(預設項)
- sanitize_attributes=True刪除⽩名單列表以外的標籤屬性
- sanitize_style=True刪除⽩名單列表以外的樣式屬性
- strip_style=True刪除所有樣式元素
- strip_class=True刪除所有class屬性
這⾥所提及的各個⽩名單列表在odoo/tools/mail.py中定義。