ODOO中的Related欄位及Computed欄位原理
難理解的引數:
Store = True
原因:ODOO 預設情況下不儲存計算欄位。(因為,可以減少資料庫的開銷)。但你知道的, 當您希望能夠執行某個函式,需要從資料庫中呼叫此值時,這會導致問題。
要修復此問題,odoo 在計算欄位上提供 store=true 標誌。
但是,還有一個問題:它只開火一次。為了解決這個問題,您需要使用@api.depends 裝飾器,以便在每次更改相關欄位時更新欄位。
@api.depends 還可以接收以逗號分隔的欄位名列表
@api.depends('field_name')
或者
@api.depends('field_name','another_field_name')
@api.one @api.depends('field2')
def _compute_field1(self):
self.field1 = 每次“field2”更改時發生的事件
field1 = fields.Char(compute=_compute_field1,store=True) field2 = fields.Char()
Related Field
原理解析:
可以通過一個小實驗驗證,related 欄位,在不新增 store = True 引數時,通過 NavCat 在資料庫中是看不到此欄位的。
由此可見:
-
Related 欄位在資料庫中是沒有儲存的,均是每次呼叫此欄位時,通過函式計算出來。
Related 欄位在資料庫中是沒有儲存的,均是每次呼叫此欄位時,通過函式計算出來。 所以,若想要讓其他函式引用此
Inverse
反引數的使用非常簡單。通常,計算欄位是隻讀的,因為它從記錄集即時計算值。如果您需要在 計算欄位上進行手動輸入,可以通過給出反函式來完成。因此,當欄位被寫入/建立時,它會觸發對修飾函式的呼叫。它反轉計算並設定相關欄位。
Invserse 通俗點講的話,他是 Compute 的相反設定.我們在 field 中設定了它對應的 Compute 計算方法,那麼這個欄位就變成了只讀的,這時候我們可以設定 inverse,來達到為該欄位賦值的目的。設定了 inverse 這個,欄位就可以在前端直接編輯,賦值就是通過這個 inverse 設定的方法。
upper = fields.Char(compute='_compute_upper',
inverse='_inverse_upper', search='_search_upper')
@api.depends('employee_id') def _compute_upper(self):
for rec in self:
rec.upper = rec.employee_name.upper() if rec.employee_name else False
def _inverse_upper(self): for rec in self:
rec.employee_name = rec.upper.lower() if rec.upper else False
步驟一:
步驟二:
步驟三:
Search
預設情況下,計算欄位不儲存到資料庫中,而是動態計算。新增屬性“store=true”將在資料庫 中儲存欄位值。儲存欄位的優點是,對該欄位的搜尋是由資料庫本身完成的。
因此,不能正常搜尋未儲存在資料庫中的計算欄位,要啟用搜索,必須顯式定義搜尋函式。這可 以通過在計算欄位中新增“搜尋”引數來實現。如果我們新增一個方法來搜尋計算欄位,那麼在 對模型進行實際搜尋之前,在處理域時會呼叫該方法。
standard_price = fields.Float(
'Cost', compute='_compute_standard_price', inverse='_set_standard_price', search ='_search_standard_price', digits=dp.get_precision('Product Price'), groups="base.group_user",
)
def _search_standard_price(self, operator, value):
products = self.env['product.product'].search([('standard_price', operator, value)], limit=None) return [('id', 'in', products.mapped('product_t