def read_group(self, domain, fields, groupby, offset=0, limit=None, orderby=False, lazy=True):
针对read_group方法的不同可用参数如下:
- domain:domain用于过滤记录。这将作为read_group方法的搜索条件。
- fields:这是一个使用分组获取的字段列表。注意这里传入的字段应在groupby参数中,除非你使用了一些聚合函数。
假设我们想要获取每个客户的平均订单量。在这种情况下,你可以使用read_group如下:
self.env['sale.order'].read_group([], ['partner_id', 'amount_total:avg'], ['partner_id'])
- 如果你想要用不同的聚合方法两次访问相同的字段,语法会有一些不同。需要传递字段名为alias:agg(field_name)。下例会给出每个用户订单的总量和平均数:
self.env['sale.order'].read_group([], ['partner_id', 'total:sum(amount_total)', 'avg_total:avg(amount_total)'], ['partner_id'])
以下是read_group方法所支持的参数列表:
- groupby:这个参数是记录分组的字段列表。它让你可以根据多个字段来分组记录。要进行这一实现,需要传递一个字段列表。例如,如果想要通过客户和订单状态来对销售订单分组,可以在参数中传递[‘partner_id ‘, ‘state’]。
- offset:这个参数用于分页。如果想要跳过一些记录,可以使用该参数。
- limit:这个参数用于分页,它表示所要获取记录的最大量。
- lazy:这个参数接收布尔值。默认值为True。如果该参数为True,结果会在groupby参数中仅通过第一个字段来进行分组。结果中你会在__context和__domain键中获取到剩余的groupby参数及domain。如果该参数值设为False,它会用groupby参数中的所有字段对数据进行分组。
扩展知识…
对date字段分组会比较复杂,因为可以根据日、周、季度、月或年来对记录进行分组。可以通过在groupby参数的 : 后传递groupby_function来改变日期的分组行为。如果想要对销售订单的月汇总进行分组,可以使用下面的read_group方法:
self.env['sale.order'].read_group([], ['total:sum(amount_total)'], ['order_date:month'])
这是一段自己写的在 sale.order 表里按人员进行分组,在一定的时间内,然后按 amount_total 大小排序
sale_order = self.env['sale.order'].read_group(domain=[('confirmation_date', '>=', date_start), ('confirmation_date', '<=', date_end)],fields=['partner_id', 'confirmation_date', 'amount_total'],groupby=['partner_id'])
mapped_data = dict([(m['partner_id'][1], m['amount_total']) for m in sale_order])
d_order = sorted(mapped_data.items(), key=lambda x: round(x[1], 2), reverse=True)[:number]
print(d_order)
网友评论