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

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

时间:2024-11-06 16:59:16浏览次数:1  
标签:group read sum outstock odoo id 模板

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

 

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. 异常处理:确保在模板中对可能的空值或边界情况进行处理,以避免报错。
 

标签:group,read,sum,outstock,odoo,id,模板
From: https://www.cnblogs.com/lyt263/p/18530557

相关文章

  • 线程-ThreadLocal
    线程-ThreadLocalThreadLocal是Java中的一个类,提供了一种创建线程局部变量的机制。每个访问ThreadLocal变量的线程都有一个独立的、初始化的变量副本。这可以避免线程间的同步问题,因为每个线程只能访问自己的ThreadLocal变量。通过ThreadLocal为线程添加的值只能由这个线程......
  • Thread多线程
    多线程并发与并行(了解)并行(parallel):指多个事件任务在同一时刻发生(同时发生)。指在同一时刻,有多条指令在多个处理器上同时执行。单核CPU同一时刻只能处理一条指令,所以单核CPU做不到并行处理。并发(concurrency):指两个或多个事件在同一个微小的时间段内发生。指在同一个时刻只能有一......
  • Qt多线程- QThread 创建多线程程序
    QThread创建多线程程序QThread类功能简介今天说一下Qt中的多线程。QThread类不依赖平台的管理线程的方法。一个QThread类的对象管理一个线程,一般从QThread继承一个自定义类,并重新定义虚函数run(),在run()函数里实现线程需要完成的任务。将应用程序的线程称为......
  • SpreadJS 在数据填充时的公式填充方案
    需求介绍很多用户使用了SpreadJS的数据填报功能。大致用法为:设计模板,填充数据源。在这个过程中,可能会出现模板中设置了公式,而在数据源填充时,公式没有携带下来的问题。比如我们定义一个模板:接下来使用setDataSpurce()填充数据源,填充后,发现只有一行有公式值,其他行无数据那么......
  • Android的自定义View和自定义ViewGroup
    Android自定义视图(View)和视图组(ViewGroup)详解在Android开发中,有时候我们需要创建一些标准控件无法满足需求的自定义视图(View)和视图组(ViewGroup)。本文将详细介绍如何创建自定义视图和视图组,包括构造方法、自定义属性、绘制逻辑、测量逻辑、布局逻辑和设置布局参数等内容。1.......
  • group by | order by| distribute by| sort by| cluster by | partition by 的区别
    目录1、orderby 和groupby1.1、orderby:排序,属于全局排序1.2、goupby:分区2、distributeby、sortby、clusterby、partitionby2.1、distributeby:分组2.2、sortby: 强制排序2.3、partitionby:分组2.4、clusterby:(culsterby =distributeby......
  • 使用Markdown编写适用于GitHub的README.md文件的目录结构
    文章目录@[toc]顶部1.使用`[TOC]`自动生成2.VSCode中的插件3.手搓目录目录相关资料本文相关代码一、概述1.1基本概念1.2两种处理模型(1)微批处理(2)持续处理1.3StructuredStreaming和SparkSQL、SparkStreaming关系二、编写StructuredStreaming程序的基本步骤三......
  • 使用Markdown编写适用于GitHub的README.md文件的目录结构
    目录顶部1.使用[TOC]自动生成2.VSCode中的插件3.手搓目录目录相关资料本文相关代码一、概述1.1基本概念1.2两种处理模型(1)微批处理(2)持续处理1.3StructuredStreaming和SparkSQL、SparkStreaming关系二、编写StructuredStreaming程序的基本步骤三、输入源3.1File源(1)创建程......
  • RT-Thread、RT-Linux与Zephyr实时性对比
    在嵌入式系统领域,实时性是一个至关重要的指标,它直接关系到系统对外部事件的响应速度和处理效率。在众多实时操作系统(RTOS)中,RT-Thread、RT-Linux和Zephyr因其各自的特点和优势,成为业界广泛关注的焦点。本文将从实时性角度出发,对这三款RTOS进行详细对比。 一、引言随着物联网、......
  • 重学前端 File、Blob、FileReader 基础知识学习
    前言JavaScript提供了一些API来处理文件或原始文件数据,例如:File、Blob、FileReader、ArrayBuffer、base64等。下面就来看看它们都是如何使用的,它们之间又有何区别和联系! 1.BlobBlob全称为binarylargeobject,即二进制大对象,它是JavaScript中的一个对象,表示原......