前言

在odoo的ORM创建数据字段的过程中,我们会经常需要定义一些字段用来计算某一些字段只和或其他计算结果。

今天介绍一个很好用的方法compute计算属性,这个方法其实是属于写在odoo fields中的属性,但是因为非常常用,还涉及ORM中的方法所以今天就单独列出来详细讲解它的用法。

如何使用odoo compute属性实现自动计算字段

我们看下面的案例。

class FandxProduct(models.Model):_name = "fandx.product"name = fields.Char("产品名称")nums = fields.Integer("数量")unit_price = fields.Float("产品单位价格")

现在有个需求,这是一个产品表,我们需要计算他的每一个产品的总价格(产品单位价格*数量),这时候就要用到我们的主角compute属性,下面看案例。

class FandxProduct(models.Model):_name = "fandx.product"name = fields.Char("产品名称")nums = fields.Integer("数量")unit_price = fields.Float("产品单位价格")# 使用_compute_all_priceall_price = fields.Float("产品总价格", compute="_compute_all_price")def _compute_all_price(self):# self取值默认是multi,所以需要循环拿到每一个record的值for record in self:# 计算每一个record的all_price的值进行赋值record.all_price = record.unit_price * record.nums

在字段中定义属性compute并指向计算方法,在数据创建的时候会自动计算这个字段的数据。

这样我们在XML中使用all_price就可以获取到产品的总价格,但是这里还有一个问题。

数据库中是没有进行持久存储的,那么数据数据量一大,每次渲染页面都要进行计算,这样是非常消耗服务器性能的,所以我们就要将计算的字段给存储起来。

如何存储odoo compute计算字段的值

方法很简单,只需要在定义的field中加上store字段,这样就会把计算到的结果给存储到数据库中。

class FandxProduct(models.Model):_name = "fandx.product"name = fields.Char("产品名称")nums = fields.Integer("数量")unit_price = fields.Float("产品单位价格")# 使用_compute_all_price# 在字段中加上store = True实现数据的持久化all_price = fields.Float("产品总价格", compute="_compute_all_price", store=True)def _compute_all_price(self):# self取值默认是multi,所以需要循环拿到每一个record的值for record in self:# 计算每一个record的all_price的值进行赋值record.all_price = record.unit_price * record.nums

这样我们在数据库中就有了all_price的字段来记录产品总价格。

但是现在又出现一个问题,计算字段是计算出了我们的结果,但是如果nums改变,或者unit_price改变了,计算字段并不会改变怎么办!

compute配合使用depends监听数据变化

class FandxProduct(models.Model):_name = "fandx.product"name = fields.Char("产品名称")nums = fields.Integer("数量")unit_price = fields.Float("产品单位价格")# 使用_compute_all_price# 在字段中加上store = True实现数据的持久化all_price = fields.Float("产品总价格", compute="_compute_all_price", store=True)# 将nums、unit_price字段进行监听,在数据变动的时候再次执行compute指向的方法进行重新赋值计算。@api.depends('nums', 'unit_price')def _compute_all_price(self):# self取值默认是multi,所以需要循环拿到每一个record的值for record in self:# 计算每一个record的all_price的值进行赋值record.all_price = record.unit_price * record.nums

到这里就基本实现了compute的所有经常使用的方法,下面一般会配合compute一起使用的属性inverse

odoo中逆向计算inverse属性使用详解

上面讲解了compute方法是用来计算对应的数据字段的。

inverse方法其实就是compute的逆向方法,默认情况下xml中对应的compute计算字段是readonly的。

当我们加上inverse逆向计算的时候,那么就可以在XML中输入对应的值,然后系统会走inverse对应的方法。

class FandxProduct(models.Model):_name = "fandx.product"name = fields.Char("产品名称")nums = fields.Integer("数量")unit_price = fields.Float("产品单位价格")# 使用_compute_all_price# 在字段中加上store = True实现数据的持久化all_price = fields.Float("产品总价格", compute="_compute_all_price", inverse='_set_unit_price', store=True)# 将nums、unit_price字段进行监听,在数据变动的时候再次执行compute指向的方法进行重新赋值计算。@api.depends('nums', 'unit_price')def _compute_all_price(self):# self取值默认是multi,所以需要循环拿到每一个record的值for record in self:# 计算每一个record的all_price的值进行赋值record.all_price = record.unit_price * record.numsdef _set_unit_price(self):for record in self:if not all([record.nums, record.all_price]):continue# 当我们手动修改all_price的值的时候,我们就可以逆向去计算出unit_price的值,进行重新赋值。record.unit_price = record.all_price / record.nums

总结

  1. odoo的compute可以实现我们对数据字段自动计算的需求。
  2. fields中加入store属性可以实现数据的持久化存储。
  3. compute计算字段在持久化存储之后不会在自动计算,需要我们配合depends来监听指定计算字段在数据改动的时候重新计算数据字段。
  4. inverse方法可以帮助我们解决compute计算字段readonly的问题,并在输入对应的字段进行逆向计算之前的字段。
  5. compute字段默认是store为False的所有search是无效的,还可以指定search的方式实现搜索。这里就不去细讲了,很简单也不常用。
  6. 还有compute_sudo属性可以设置字段在使用的时候是否以超级管理员的方式来进行计算,这里store=True的时候默认为True,否则默认为False,了解一下就可以了。
  7. 如果有问题可以在下方留言。

如何使用odoo的compute方法,自动计算odoo字段相关推荐

  1. C# DataTable Compute方法的使用

    在开发中需要对DataTable的数据进行处理,比如累加,求最大最小及平均值等,以前都采用手工对DataTable进行循环并计算的方式,现在发现DataTable的Compute方法可以轻松实现这些功 ...

  2. 【ODOO】Docker Compose 编排ODOO应用

    Dockerfile Dockerfile 是一个用于构建自定义镜像的文本文件,文本内容包含了用于指导 Docker 创建自定义镜像的一系列指令,是用于创建镜像的蓝图. 这通常在将我们自己的程序打成D ...

  3. Java8学习--Map的compute方法

    你只会用 map.put?试试 Java 8 compute ,操作 Map 更轻松! 今天栈长分享一个实用的 Java 8 开发技能,那就是 Map 接口中增加的 compute 方法,给 Map ...

  4. SQL SERVER 2008不能修改表的解决方法(增加字段、修改字段名)(未解决)

    SQL SERVER 2008不能修改表的解决方法(增加字段.修改字段名)(未解决) 参考文章: (1)SQL SERVER 2008不能修改表的解决方法(增加字段.修改字段名)(未解决) (2)ht ...

  5. 【Groovy】编译时元编程 ( AST 语法树分析 | ClassNode 根节点 | 方法 Methods 节点 | 字段 Fields 节点 | 属性 Properties 节点 )

    文章目录 一.AST 语法树分析 一.AST 语法树分析 在上一篇博客 [Groovy]编译时元编程 ( 编译时元编程引入 | 声明需要编译时处理的类 | 分析 Groovy 类的 AST 语法树 ) ...

  6. LINQ找出重复和不重复的元素及linq OrderBy 方法 两个字段同时排序有关问题

    //重复元素:3,4,5 //不重复元素:1,8,9 int[] arr = { 1, 3, 3, 3, 4, 5, 4, 5, 8, 9, 3 };//不重复元素 var unique = arr. ...

  7. JPA-save()方法会将字段更新为null的解决方法

    JPA-save()方法会将字段更新为null的解决方法 参考文章: (1)JPA-save()方法会将字段更新为null的解决方法 (2)https://www.cnblogs.com/qingmu ...

  8. Mcad学习笔记之通过反射调用類的方法,屬性,字段,索引器(2種方法)

    相关文章导航 Sql Server2005 Transact-SQL 新兵器学习总结之-总结 Flex,Fms3相关文章索引 FlexAir开源版-全球免费多人视频聊天室,免费网络远程多人视频会议系统 ...

  9. 亲测好用的Odoo集成X-SpreadSheet方法!

    目录 一.背景 二.集成过程 1.下载X-SpreadSheet源码到本地 2.将X-SpreadSheet集成到Odoo中 3.创建QWeb页面,spreadsheet.xml 4.创建对应的js文 ...

最新文章

  1. 用Xwt构建跨平台应用程序[转载]
  2. html 树形结构_HTML学习之语义化标签
  3. 超一流 | 从XLNet的多流机制看最新预训练模型的研究进展
  4. Java 微服务框架选型(Dubbo 和 Spring Cloud?),大厂 HR 如何面试
  5. 想起了那个充满忧伤的夏天
  6. linux内核:__user,__kernel,__safe,__force,__iomem
  7. 数组的方法之(Array.prototype.reduce() 方法)
  8. 【译文 Part 1】NEO vs. ETH--为什么NEO可能是2018最强数字货币?
  9. systemctl命令_开发者必备Linux命令
  10. Bootstrap如何禁止响应式布局 不适配
  11. 第二章、Linux操作系统及常用命令
  12. 混沌大学--喜茶模式拷贝指南
  13. win10关闭windows聚焦_Win10聚焦锁屏壁纸无法自动更换的处理方法
  14. Datawhale数据挖掘 数据分析笔记
  15. Lenovo y40-70安装Ubuntu 16.04*后出现的[Firmware Bug]
  16. 【okhttp3.OkHttpClient】ClassNotFoundException: okhttp3.OkHttpClient
  17. 计算机系给未来的自己写信,给未来的自己写信
  18. 推荐程序员面试秘籍!抖音Java后端123面开挂,太牛了!
  19. windows xp下如何添加开机自启动的程序
  20. 耦合式是什么意思_什么是耦合?

热门文章

  1. Java私有构造方法
  2. 百度Apollo7.0_Control控制模块:纵向控制源码解析
  3. R实战 | 置换多元方差分析(以PCoA的PERMANOVA分析为例)
  4. 探索LeetCode【0011】盛最多水的容器(已懂)
  5. Linux修改文件名(mv和rename)
  6. c语言杨辉三角形7行7liu,7. C语言杨辉三角(两种方法)
  7. oracle in语句的用法,oraclein语句
  8. MATLAB输入排序代码,matlab快速排序算法实现
  9. 如何进行有效的产品规划?
  10. xxxx has no uot-of-line virtual method definitions