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)]

目录
相关文章
lyL
|
3月前
|
项目管理 开发者
业务架构图
本文介绍了业务架构图的核心概念与绘制方法,涵盖业务定义、架构分层(组织层、基础能力层、业务能力层、业务应用层)、模块划分与功能分解,并强调通过分层、分模块、分功能三步法实现业务的抽象与结构化表达,提升客户理解与开发效率。
lyL
440 1
业务架构图
|
5天前
|
人工智能 Linux API
新手闭眼抄作业!OpenClaw三步极速部署教程(阿里云/Windows11/MacOS/Linux)+免费大模型对接+问题解答
2026年3月,开源AI智能体工具OpenClaw(曾用名Clawdbot)凭借**零代码操作、本地优先隐私安全、多平台适配、技能可扩展**的核心优势,成为普通人搭建专属AI助手的首选。它不同于普通聊天机器人,能将自然语言指令转化为文件管理、办公自动化、信息检索、任务执行等实际操作,真正实现“一句话搞定繁琐工作”。
483 4
基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)
基于Vue2用keydown、keyup事件实现长按键盘任意键(或组合键)3秒触发自定义事件(以F1键为例)
|
SQL 架构师 Java
SpringBoot从入门到精通(二十八) JPA 的实体映射关系,轻松一对一,一对多,多对多关系映射!
前面讲了Spring Boot 使用 JPA,实现JPA 的增、删、改、查的功能,同时也介绍了JPA的一些查询,自定义SQL查询等使用。JPA使用非常简单,功能非常强大的ORM框架,无需任何数据访问层和sql语句即可实现完整的数据操作方法。但是,之前都是介绍的单表的增删改查等操作,多表多实体的数据操作怎么实现呢?接下来聊一聊 JPA 的一对一,一对多,多对一,多对多等实体映射关系。
SpringBoot从入门到精通(二十八) JPA 的实体映射关系,轻松一对一,一对多,多对多关系映射!
|
NoSQL Redis Docker
Docker获取镜像和运行镜像
这篇文章介绍了如何使用Docker获取镜像以及运行镜像的具体步骤和命令。
2231 0
|
数据库 数据安全/隐私保护 开发者
Odoo 15开发手册第一章 使用开发者模式快速入门
Odoo提供了一个快速应用开发框架,尤其适合构建商业应用。这类应用通常用于保存业务记录和工作流。Odoo 不仅简化了这类应用的构建,还提供了看板、日历、图表等视图的丰富组件,用于创建难以抗拒的用户界面。
1767 3
Odoo 15开发手册第一章 使用开发者模式快速入门
|
XML JavaScript 前端开发
odoo 给列表视图添加按钮实现数据文件导入
odoo 给列表视图添加按钮实现数据文件导入
549 0
|
计算机视觉 C++ Windows
C++VS2019中配置opencv(在空项目中配置opencv和在cmake中配置opencv)-解决的问题 找不到opencv_world440d.dll
C++VS2019中配置opencv(在空项目中配置opencv和在cmake中配置opencv)-解决的问题 找不到opencv_world440d.dll
488 0
|
JavaScript 前端开发 安全
odoo wizard界面显示带复选框列表及勾选数据获取
odoo wizard界面显示带复选框列表及勾选数据获取
596 1
|
机器学习/深度学习 数据挖掘 PyTorch
# 【深度学习】:《PyTorch入门到项目实战》(十一):卷积层
>之前已经介绍了基本的神经网络知识以及一些处理过拟合欠拟合的概念。现在我们正式进入卷积神经网络的学习。CNN是⼀类强⼤的、为处理图像数据⽽设计的神经⽹络。基于卷积神经⽹络架构的模型在计算机视觉领域中已经占主导地位,当今⼏乎所有的图像识别、⽬标检测或语义分割相关的学术竞赛和商业应⽤都以这种⽅法为基础。对于计算机视觉而言,面临的一个重大挑战就是数据的输入可能会很大。例如,我们有一张64$\times$ 64的图片,假设通道数为3,那么它是数据量相当于是一个$64\times 64\times 3=12288$的特征向量。当我们要操作更大的图片时候,需要进行卷积计算,它是卷积神经网络中非常重要的一部
 # 【深度学习】:《PyTorch入门到项目实战》(十一):卷积层