如果store = True

时间:2016-12-16 16:20:58

标签: openerp

我使用Odoo V10中的UI在product.product模型上定义了一个新字段。该字段的定义如下:

Name = x_sellable_inventory
Type = float
Readonly = true
Dependencies = qty_available,outgoing_qty

Compute方法是:

for record in self:
    record['x_sellable_inventory'] = record.qty_available - record.outgoing_qty

我将此字段添加到视图中,并确认如果针对产品调整了现有库存,则该字段会正确更改。到目前为止,一切都按预期工作。

现在,我希望能够从sale.order.line访问此值,因此我在sale.order.line上创建了一个相关字段来访问它。它的定义如下:

Name =  x_product_sellable_inventory_new
Type = float
Readonly = true
Stored = true
Related Field = product_id.x_sellable_inventory

然后我将此字段添加到销售订单视图中,以便我可以在订单行列表中看到它。它对于树中的每个订单行都会出现一次。

现在,当我更改产品的现有数量时,它仍会在产品视图中正确更新,但销售订单行上的值永远不会更改。它永远不会从设置的初始时间改变。

如果取消选中Store选项,则值会正确更新。这里发生了什么?如果相关字段是否存储,为什么重要?每当product_id.x_sellable_inventory的值发生变化时,它是否应该更新?

2 个答案:

答案 0 :(得分:3)

默认情况下不存储计算字段。你知道的当您希望能够执行要求数据在数据库中可用的功能时,这会导致问题。

要修复此Odoo,请在计算字段上提供store = True标志。

gotcha是它只发射一次。为了解决这个问题,您需要使用@api.depends装饰器(如@danidee和@CZoellner所述),以便每次更改相关字段或字段时更新字段。

@api.depends还可以接收以逗号分隔的字段名称列表。

@api.depends('field_name')

OR

@api.depends('field_name','another_field_name')

@api.one
@api.depends('field2')
def _compute_field1(self):
    self.field1 = SOMETHING THAT OCCURS EVERY TIME `field2` CHANGES


field1 = fields.Char(compute=_compute_field1,store=True)
field2 = fields.Char()

答案 1 :(得分:1)

我认为我的问题是我试图用作依赖关系的字段本身不是stored。似乎需要存储字段才能正确地作为依赖项运行,这是有道理的。如果依赖字段不是存储在数据库中的字段,则模型无法知道依赖字段已更改。 qty_availableoutgoing_qty不是存储字段。