odoo中对多条数据按条件进行分类汇总 read_group的用法总结并抽取出公式

news/2024/11/6 17:02:45/文章来源:https://www.cnblogs.com/lyt263/p/18530557

今天在工作中遇到一个这样的问题。要求:做一个打印模板实现下面图中的分类汇总

 

py3o://for="o in object.delivery_containers_line.read_group(domain=[('delivery_order_id','=',object.id)], fields=['customer_id', 'delivery_order_id', 'sales_order_id', 'supplier_id','purchase_currency','customer_material','outstock_qty:sum','outstock_purchase_amount:sum','outstock_purchase_utaamount:sum','outstock_sale_amount:sum'],groupby=['customer_id', 'delivery_order_id', 'sales_order_id', 'supplier_id','purchase_currency','customer_material'], lazy=False)"

我用的是odoo12中py3o的模板
下面来分析上面代码的作用

1. read_group 方法

read_group 是 Odoo 的一个用于对模型数据进行分组和聚合的方法。它通常用于生成报表时需要对数据进行按字段分组的场景。

语法

read_group(domain, fields, groupby, lazy=False)

参数解释

  • domain: 查询的过滤条件。domain=[('delivery_order_id','=',object.id)] 指定了只有与当前 delivery_order_id 匹配的记录才会被选中。
  • fields: 需要返回的字段和汇总的字段。例如:
    • 'customer_id', 'delivery_order_id', 'sales_order_id', 等这些字段将按组进行分组。
    • outstock_qty:sum, outstock_purchase_amount:sum 等这些字段将在每组中进行汇总,汇总方法是 sum
  • groupby: 指定用于分组的字段。这里的数据会按照 customer_id, delivery_order_id, sales_order_id, 等字段进行分组,意味着数据会被按这些字段的不同组合拆分。
  • lazy=False: 指定是否使用懒加载,False 代表一次性加载所有数据。

2. 字段汇总(聚合)

fields 中,字段后面加上 :sum 是 Odoo 提供的一种简便方式来进行汇总操作。例如:

  • outstock_qty:sum:表示对所有 outstock_qty 字段进行求和。
  • outstock_purchase_amount:sum:表示对所有 outstock_purchase_amount 字段进行求和。

3. for="o in object.delivery_containers_line.read_group(...)"

这个 for 循环是用来遍历 read_group 返回的聚合数据结果。每一项 o 代表一个分组的结果对象。在这个对象中:

  • o['customer_id']:是分组依据的字段之一。
  • o['outstock_qty:sum']:是该组所有 outstock_qty 字段的汇总值。

4. 模板中的数据展示

模板中的数据展示逻辑会依赖于 read_group 返回的结果。比如,我们可以将汇总的字段显示在模板中。

<span t-esc="o['outstock_qty:sum']"/>  <!-- 显示分组后的 outstock_qty 的总和 -->

知识点归纳和总结

1. read_group 关键用法

  • read_group 是 Odoo 提供的强大聚合工具,适用于报表生成和数据分析。
  • domain 用于过滤数据,groupby 用于按指定字段分组,fields 用于选择和聚合字段。
  • 汇总函数:常用的聚合函数包括 sumavgminmax 等。

2. 模板中的 for 循环

  • 在报告模板中,for 循环是遍历分组数据并动态显示数据的核心。
  • t-esc 用于将数据嵌入 HTML 中并显示。

3. Py3O 和 LibreOffice 打印

  • Py3O 是 Odoo 中用于将报告导出为各种格式(如 PDF、Excel)的工具之一,通常通过模板生成报表。
  • LibreOffice 作为兼容的办公软件,支持 Odoo 的打印功能,适用于不同的报表格式。

经验总结:如何处理类似问题

基于以上分析,下面总结一个公式或流程,可以帮助你快速处理类似的问题:

常用的处理步骤公式:

  1. 选择分组字段

    • 确定需要分组的数据字段,例如 customer_id, delivery_order_id 等。
    • 选择分组的依据字段时,应考虑业务需求,如订单号、客户、供应商等。
  2. 选择需要聚合的字段

    • 确定需要进行聚合(如求和、平均等)的字段。
    • 格式:字段名:sum, 字段名:avg 等。
  3. 构建 read_group 查询

    • 使用 domain 筛选数据。
    • 使用 groupby 按字段分组。
    • fields 中选择聚合字段及分组字段。
  4. 模板中显示数据

    • 在报告模板中,使用 for 循环遍历 read_group 返回的数据。
    • 使用 t-esc 显示字段数据。
  5. 处理空值和边界情况

    • 在模板中要处理好空值和不符合预期的数据长度问题。例如,检查数据的存在性和长度,避免错误。
  6. 定期验证结果

    • 确保聚合字段的计算和显示是正确的。对于大数据量的报表,可以做性能优化,使用缓存等策略。

总结公式:

对于业务逻辑中“分组并汇总”的问题,可以使用以下模板公式:

object.MODEL_NAME.read_group(domain=[('field', '=', value)], fields=['field_to_group', 'field_to_aggregate:sum', 'field_to_aggregate:avg'], groupby=['field_to_group'], lazy=False
)

在模板中,您可以遍历这个结果并显示汇总数据:

<t t:for="o in object.MODEL_NAME.read_group(...)"><span t-esc="o['field_to_aggregate:sum']"/>
</t>

最佳实践总结:

  1. 合适的 domain 过滤条件:始终根据报表需求制定合适的过滤条件,确保提取的数据是正确和有意义的。
  2. 性能优化:对于大规模数据,read_group 是非常高效的,但也要注意避免不必要的查询,可以考虑使用索引和分页。
  3. 异常处理:确保在模板中对可能的空值或边界情况进行处理,以避免报错。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/827739.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百万年薪!2024 Salesforce高薪职位排行

随着Salesforce在全球的普及,这一平台不仅带来了新的职场机会,更为从业者提供了优渥的薪资待遇。 最近的Salesforce薪资调查显示,Salesforce生态系统中不同职位的薪资水平相当可观,尤其在美国市场,一些顶级岗位的年薪可达到令人惊叹的百万级别。今天我们就来细数2024年Sal…

初识AI大模型,ollama使用,llama factory大模型微调,lama.cpp模型转换guff

最近了解了下生成式AI对话,下面是自己的一些尝试记录。ollama 安装及使用1、安装我是在windows环境下安装的,很简单,访问:https://ollama.com/ ,下载windows安装包,打开安装就行了。cmd输入ollama -v检验是否安装成功。2、配置在环境变量的用户变量中加入如下几个:   …

zlibrary中文版入口及电子书客户端/app(2024更新)

Z-library是一个全球范围内庞大的数字图书馆之一,其藏书量非常丰富。截至最新数据,Z-library共收录了超过9,826,996册电子书以及84,837,646篇学术期刊文章。这个数字图书馆覆盖了从经典文学巨著到前沿理工学科,从人文艺术瑰宝到专业学术论文的广泛领域,几乎能够满足每一位求…

Playwright:掌握Web自动化测试的新利器

在快速迭代的互联网环境中,Web应用的测试工作日益繁重。传统的手动测试不仅耗时耗力,还难以保证测试的全面性和准确性。面对复杂多变的测试需求,你是否也曾感到力不从心? 别担心!本周四晚上八点,我们特别策划了一场关于Playwright的公开课,旨在帮助大家掌握这款Web自动化…

NOIP2024加赛2

NOIP2024加赛2 题目来源: 2023NOIP A层联测18\(T1\) HZTG5733. 新的阶乘 \(100pts\)预处理素数后直接对 \(1 \sim n\) 进行质因数分解因为有太多冗余枚举导致无法通过。考虑枚举最终形式。具体地,从质因数的角度入手,设当前枚举的质数为 \(p\) ,暴力求出 \(ip\) 中 \(p\) 的…

用处多多!信创PostgreSQL认证证书含金量

PostgreSQL是目前讨论比较多的数据库技术,国内很多大的企业都在开发基于PostgreSQL的数据库产品,比如腾讯云TDSQL-PG版、阿里云PolarDB-PG版、人大金仓等等,考取PostgreSQL数据库证书对个人在数据库领域的职业发展具有多方面的积极作用。以下是对其用处的详细分析: ​ 一、…

南沙C++信奥赛陈老师解一本通题 1225:金银岛

​【题目描述】某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有ss个种类, 每种金属重量不同,分别为n1,n2,...,nsn1,n2,...,ns,同时…

精准、智能、高效:AI平台如何提升医疗数据处理效率50%

思通数科的大模型是一款集成自然语言处理、多模态分析与知识图谱技术的智能系统,专为提升行业信息处理效率和决策支持而设计。该模型依托深度学习与数据驱动,能够在合同审查、智能问答、医疗文本处理等场景中实现精准的文本分类、信息抽取与风险识别。特别在多模态数据处理方…

MySQL 8.0 执行COUNT()很慢原因分析

MySQL 8.0 执行COUNT()很慢原因分析 1.1 问题描述 线上 MySQL8.0.32 环境在执行 SELECT COUNT (1) FROM t0 获取表行数很慢,同样场景下该 SQL 在 MySQL5.7 环境很快就能拿到结果 1.2 问题复现 测试版本:8.0.25 MySQL Community Server - GPL 和 5.7.21-log MySQL Community S…

DAC控制LM358输出4~20ma电路

在带负载0~800Ω左右,电流并不会发生偏差使用注意事项有些时候LM358内部的运放不一定都使用到在使用画PCB和原理图的时候要注意输入端不能直接接地,否则芯片会发烫。并且给出TI的LM358部分说明以及未使用时的处理方法。

mac 关闭所有浏览器的前进后退功能

系统偏好设置 => 触控板 => 更多手势 => 在页面之间轻扫 取消勾选即可。如下图所示:

科陆电子:从卷到赢,连接型CRM助力营销服全链路质、效双飞跃

深圳市科陆电子科技股份有限公司是美的集团旗下企业,于1996年在深圳成立,主板上市企业(2007年在深交所上市,股票代码002121)、国家高新技术企业,拥有国家认定企业技术中心和多个国家级、省级技术中心、实验室。公司主营业务聚焦在智能电网和新型电化学储能两大板块,战略愿景是成…