1. 程式人生 > >ODOO中的Related欄位及Computed欄位原理

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 欄位在資料庫中是沒有儲存的,均是每次呼叫此欄位時,通過函式計算出來。   所以,若想要讓其他函式引用此

related 欄位,必須新增 store = True 屬性

 

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