Python中如何实现odoo分组功能

odoo 分组 组内的成员 存在哪张表里面


Python中如何实现odoo分组功能
2 回复

在Odoo里做分组,主要就是玩转read_group这个API。这玩意儿是ORM的核心方法,专门用来做数据聚合统计的。

给你个最直接的例子,假设我们有个销售订单模型sale.order,想按state字段分组,并计算每个状态的订单总额:

from odoo import models, api

class SaleOrder(models.Model):
    _inherit = 'sale.order'
    
    def get_grouped_orders(self):
        # 基础分组查询
        result = self.env['sale.order'].read_group(
            domain=[],  # 查询条件,空列表表示所有记录
            fields=['amount_total:sum'],  # 要聚合的字段和聚合函数
            groupby=['state'],  # 按哪个字段分组
            lazy=False  # 返回扁平化结构,方便处理
        )
        
        # 返回的数据结构示例:
        # [
        #     {'state': 'draft', 'amount_total': 1000, '__count': 5},
        #     {'state': 'confirmed', 'amount_total': 5000, '__count': 3},
        # ]
        return result

更实用的场景通常是在视图里定义分组。比如在列表视图里加个默认分组:

<!-- 在XML视图定义中 -->
<record id="view_sale_order_tree" model="ir.ui.view">
    <field name="name">sale.order.tree</field>
    <field name="model">sale.order</field>
    <field name="arch" type="xml">
        <tree default_group_by="state">
            <field name="name"/>
            <field name="date_order"/>
            <field name="amount_total"/>
            <field name="state"/>
        </tree>
    </field>
</record>

多级分组也简单,read_groupgroupby参数传列表就行:

# 多级分组:先按公司,再按状态
result = self.env['sale.order'].read_group(
    domain=[],
    fields=['amount_total:sum', 'margin:avg'],  # 可以多个聚合字段
    groupby=['company_id', 'state'],  # 多级分组
    lazy=False
)

如果要在分组结果里显示关联字段,记得用点号语法:

# 分组时显示关联模型的字段
result = self.env['sale.order'].read_group(
    domain=[],
    fields=['partner_id.country_id.name'],  # 显示客户的国家名称
    groupby=['state'],
    lazy=False
)

read_group还支持各种聚合函数:sumavgminmaxcountlazy参数控制返回结构,设为True时是层级结构,适合树状展示;False时是扁平列表,方便编程处理。

总结:用read_group做数据聚合,在视图里加default_group_by实现界面分组。


没有图, 描述的也不是很清楚~

回到顶部