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_group的groupby参数传列表就行:
# 多级分组:先按公司,再按状态
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还支持各种聚合函数:sum、avg、min、max、count。lazy参数控制返回结构,设为True时是层级结构,适合树状展示;False时是扁平列表,方便编程处理。
总结:用read_group做数据聚合,在视图里加default_group_by实现界面分组。
没有图, 描述的也不是很清楚~

