2016-05-23 61 views
2

我有一個計算字段,必須更新字段更新時。 於是我就用@api.depends('field1')和鏈接功能Odoo:計算字段,在某些情況下不更新?

field_to_compute: fields.integer(compute='the_function' store=True) 

它工作正常。

但是要知道,我想更新時field1取值爲A,並保持不變時field1取值B。但是field_to_compute的舊值是從數據庫導入的,並未進行計算。

所以,我有兩個問題:

  • 我怎麼能允許用戶設置的值自己。 (我可以修改它, 但是當我創建一個新的成員,它會被計算,只有經過 第一救我可以修改它在UI)
  • 我怎樣才能讓這樣的:

    @api.depends('field1') 
    def the_function(self): 
        value = self.field1 
        if value == A: 
         field_to_compute = 123123 
        elif value == B: 
         field_to_compute = stored_field_to_compute #field_to_compute 
    

    保持相同的值作爲一個前

EDIT(例如)存儲:

我在當前模型中的res.partner,繼承res.partner。 我有個字段在它:

'model_state': field.char(compute='compute_type', string = 'Demand', store=True, readonly=True) 

在第二res.partner繼承res.partner的太,另一模塊中,我有2個字段:gradestatus,分別一個int和many2one 。以相同的方式計算與model_state相同的compute_type。

我也是在這個res.partner,有one2many場:link_ids

所以我的功能是:

@api.depends('link_ids.type', 'link_ids.result') 
def compute_type(self): 
    for record in self: 
     if self.link_ids: 
      if self.link_ids.result == 'A': 
       if self.link_ids.type == 'type1': 
        record.model_state = 'Mytext' 
        record.grade = 15 
        record.state = 1 #this is an id 
       elif self.link_ids.result == 'B': 
        record.model_state = 'MySecondText' 
        record.state = 2 #this is an id 

我不會把所有的東西,因爲它就像25 elif的(不是所有的如果等等等等),所以它不會相關。我查了很多時間,如果沒有什麼修改record.grade,如果沒有做任何事情,在其他或不知道,但它只是被清空。

基本上簡化了,如果結果「OK」的話我想做點什麼。把國家的身份證更改爲「接受」,給一個文本(如標題),給他一個更好的成績,如果不是,他有一個「被拒絕」的國家的身份證,給其他文本,並且保持與其實際相同的等級。

+0

你怎麼能猜得到'self.link_ids.result'這個one2many的結果呢?作爲link_ids可能包含多個記錄,因此可能會有多個結果。並且希望代碼中沒有錯誤,這裏的錯字實際上取決於它的@ api.depends(...)' –

+0

主鍵,對於一個res_partner你只能提出一個需求。它只是爲了在樹視圖中訪問我的res_partner並選擇其中一個(我在可編輯的樹視圖中)。所以,當我在res_partner中詢問links_ids時,它會找到他所在的元組並查看這些值。我嘗試了很多,它一直做我的預期,除了一定不能改變的領域 (我需要在我的模型中選擇一個res.partner,而many2one視圖對此非常有用) –

+0

關於錯字,我添加了's',它只是在我的文章中輸入錯誤,而不是在代碼 –

回答

2

自己做一個預取(field_to_compute必須存儲):

@api.multi 
@api.depends('field_x') 
def _compute_field_to_compute(self): 
    # prefetch 
    data = {d['id']: d['field_to_compute'] 
      for d in self.read(['field_to_compute'])} 
    for record in self: 
     if record.field_x == '123456': 
      record.field_to_compute = '654321' 
     else: 
      record.field_to_compute = data.get(record.id, 'default') 
+0

非常感謝,我會盡快嘗試! 即使在我將刪除需求之後,這是否會保留我的res_partner計算字段? (@ api.depends是指需要的字段,計算的字段在res_partner中,所以當我刪除需求時,計算出的每個字段都被刪除。 –

+0

我得到這個錯誤,對於record._origin record.origin和self._origin record.freemason_grade = record._origin.freemason_grade AttributeError:'res。夥伴'的對象沒有屬性'_origin' (在odoo 8下) 關於第二個選項,我需要存儲兩個不同的字段,我只需要將d ['id']更改爲d ['di']例如第二個例子? –

+0

我將編輯我的anwser。 _origin解決方案只能在交換中使用。關於第二個問題:您可以使用字典中的字典。只需用'{'stored_field_1':d ['stored_field_1'],'stored_field_2':d ['stored_field_2']}'替換'd ['field_to_compute']'並像'record.stored_field_1 = data.get(record .id,{})。get('stored_field_1','default')' – CZoellner

1

如果該值爲B只是不做任何事......或更好:只在需要時設置字段值。喜歡的東西:

def _compute_foo(self): 
    for item in self: 
     if item.other_field != B: 
      item.foo = 'newvalue' 

我覺得你的問題是,你沒有設置你應該計算領域(見item.foo = 'newvalue')做的值。

看看official docs

+0

當我沒有設置任何值的字段,它變爲空(空) 編輯:我認爲它試圖計算無論如何,因爲它是一個計算字段,但它沒有看到給定的值,所以它根本不輸入任何價值..即使它是商店=真 –

0

嘗試:

@api.onchange('field1') 
def function(self) 
    if value == A: 
     field_to_compute = 123123 
    elif value == B: 
     field_to_compute = stored_field_to_compute #field_to_compute keep the same value as the one stored before 
1

你應該試試以下,

@api.onchange('field1') 
def function(self): 
    field_value = self.field_to_compute 
    if self.field1 == A: 
     field_value = 123123 
    self.field_to_compute = field_value 
+0

我只是試過,它的工作原理,如果值是A,它會給123123. 但如果值是B它仍然是空的,即使它不是。 但我使用api.depends,因爲我修改了2個不同模塊的值。 當它調用計算時,它會先關閉將要計算的字段,然後運行該函數。 也許我將不得不創建一個字段,其中存儲的字段的實際狀態 –

+0

只是爲了精確,我檢查之前和之後修改數據庫與phppgadmin和它後爲NULL。 –

+0

你能給我多一點想法,你想實現什麼目標與示例數據? –

0

對於計算領域需要將它的值保存在數據庫表中,我們使用「@ api..depends('field_attributes')」裝飾器,當有更改發生在定義的字段屬性,它會觸發執行函數。

對於不需要在數據庫表中保存其值的計算字段,我們不再需要這個「@ api..depends('field_attributes')」,重新加載表單將作爲觸發器函數的執行。但這樣做的缺點是,我們無法從這個特定領域搜索數據。