2015-12-21 44 views
1

我在樹結構中有一些數據。使用來自孩子的數據計算(未存儲)一個字段。 在表單視圖中,我顯示了計算字段和父字段。因此,我最終從模型中讀取了很多記錄 - 而且Odoo似乎計算了所有這些記錄的計算字段,即使視圖只需要一個記錄的計算字段。Odoo字段計算了太多的記錄

我認爲這是由預取機制引起的,但我試圖在上下文中設置prefetch_fields=False,這並沒有幫助。

任何想法如何避免計算所有不必要的值? (存儲計算字段不是一個選項)。

一個簡單的例子給建設一個想法:

parent_id = fields.Many2one(...) 
child_ids = fields.One2many(...) # Inverse parent relation 
comp = fields.Integer(compute="_compute_comp") 

@api.one 
def _compute_comp(self): 
    sum = 0 
    for c in self.child_ids: 
     sum += c._get_complicated_value() 
    self.comp = sum 

,並與一個觀點:

<field name="parent_id" /> 
<field name="comp" /> 

comp總是計算爲孩子的孩子。與<field name="parent_id" />它也計算爲所有父母的孩子。

回答

1

你可以使用@ api.depends

@ api.depends

如果任何裝飾指定的字段是由ORM改變或變更該裝飾將觸發調用函數裝飾形式:

@api.depends('name', 'an_other_field') 
def afun(self): 
    pass 

注意

當你重新定義取決於你必須重新定義所有@ api.depends,所以它 失去了他的一些興趣。

新API的一個重大改進是,依賴會以一種簡單的方式自動插入到表單中。你不必擔心修改視圖了。

@api.one 
@api.depends('child_ids') 
def _compute_comp(self): 
    sum = 0 
    for c in self.child_ids: 
     sum += c._get_complicated_value() 
    self.comp = sum 
+0

謝謝您的回答,但我不能看到@ api.depends裝飾怎麼會少給我的計算... 有用於計算相關記錄的字段不是一個問題 - 有外地來計算只有相關的記錄是一個問題。 – cgs

+0

看到這個鏈接https://github.com/odoo/odoo/blob/9.0/openerp/api.py#L169-L191 –

+0

我真的看不到如何裝飾將限制計算。如果修飾器列表中提到的字段發生變化,記錄將被重新計算,但它將如何改變第一次計算? – cgs