我使用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
的值发生变化时,它是否应该更新?
答案 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_available
和outgoing_qty
不是存储字段。