ODOO中的Related字段及Computed字段原理

简介: 难理解的参数: Store = True 原因:ODOO 默认情况下不存储计算字段。(因为,可以减少数据库的开销)。但你知道的, 当您希望能够执行某个函数,需要从数据库中调用此值时,这会导致问题。要修复此问题,odoo 在计算字段上提供 store=true 标志。

难理解的参数:

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_1

可以通过一个小实验验证,related 字段,在不添加 store = True 参数时,通过 NavCat 在数据库中是看不到此字段的。

由此可见:

Related 字段在数据库中是没有存储的,均是每次调用此字段时,通过函数计算出来。

related_2

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

步骤一:

related_3

步骤二:
related_4

步骤三:

related_5

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_tmpl_id').ids)]

目录
相关文章
|
8月前
|
存储 数据库
ABAP 数据库表 Size Category 字段的准确含义
ABAP 数据库表 Size Category 字段的准确含义
62 0
|
12月前
|
自然语言处理 算法 数据挖掘
白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
94 0
|
存储 数据库 Python
odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)
odoo 开发入门教程系列-计算的字段和变更(Computed Fields And Onchanges)
146 0
Elastic:查询时字段runtime fields不显示,如何处理?
很多时候runtime field是结合一起使用的,这时没有任何问题,因为这类需要一般将聚合结果显示出来就行了。但是当我们需要将runtime fields也查询出来时发现查询结果中是不会显示它们的,下面我们通过具体的案例来解决这个问题
76 0
|
存储 小程序 数据挖掘
不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
不必Reindex,利用runtime_fields优雅地解决字段类型错误问题
|
JSON API 数据格式
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
443 0
FastAPI(13)- 详解 Fields,针对 Pydantic Model 内部字段添加额外校验和元数据
如何利用BAPI SD_SALESDOCUMENT_CHANGE修改Sales Order的字段
假设我想修改S/4HANA里Sales Order抬头的Service Date字段SERV_DATE: 首先从数据库表VBKD里查找到SERV_DATE修改之前的值为2020年1月1日
|
数据库
SAP 数据库表CRMD_ORDERADM_I字段OBJECT_TYPE的计算逻辑
SAP 数据库表CRMD_ORDERADM_I字段OBJECT_TYPE的计算逻辑
199 0
SAP 数据库表CRMD_ORDERADM_I字段OBJECT_TYPE的计算逻辑
SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
80 0
SAP Spartacus b2b table,通过listService的table type字段来控制要加载的数据类型
|
数据库
数据库表CRMD_ORDERADM_I里字段OBJECT_TYPE的计算逻辑
数据库表CRMD_ORDERADM_I里字段OBJECT_TYPE的计算逻辑
100 0
数据库表CRMD_ORDERADM_I里字段OBJECT_TYPE的计算逻辑