Overview
✅ Purpose
- Perform aggregation (e.g., count, sum, avg)
- Group records by one or more fields
- Use in dashboards, KPIs, and summarized reports
✅ Syntax
recordset.read_group(
domain,
fields,
groupby,
offset=0,
limit=None,
orderby=False,
lazy=True
)
Parameters
Parameter |
Description |
| domain | Filter conditions ([] for all records) |
| fields | Fields to aggregate (with functions like sum:amount_total) |
| groupby | Field(s) to group by |
| lazy | If True, only the first level of groups is returned |
🧠 Realistic Odoo Example: Sales Grouped by Salesperson
results = self.env[‘sale.order’].read_group(
domain=[(‘state’, ‘=’, ‘sale’)],
fields=[‘amount_total:sum’, ‘user_id’],
groupby=[‘user_id’]
)
for res in results:
print(f”{res[‘user_id’][1]} – Total: {res[‘amount_total’]}”)
✅ This returns the total sales per salesperson (user_id).
res = self.env[‘res.partner’].read_group(
domain=[],
fields=[‘country_id’, ‘id:count’],
groupby=[‘country_id’]
)
# Output: [{‘country_id’: (12, ‘India’), ‘id_count’: 56}, …]
res = self.env[‘sale.order’].read_group(
domain=[(‘state’, ‘=’, ‘sale’)],
fields=[‘amount_total:sum’, ‘date_order:month’],
groupby=[‘date_order:month’]
)
✅ Aggregates total sales by month.
✅ Summary Table
Feature |
Description |
| Aggregation support | sum, count, avg, min, max |
| Grouping | Yes, with one or multiple fields |
| Efficient | Yes, works at DB level |
| Lazy loading | Controls nested group expansion |
| Use cases | Dashboards, KPIs, summarized reports |
⚠️ Notes
- read_group() does not return recordsets, but a list of dictionaries
- If grouping by many2one, result includes (id, name) tuple
- Requires fields in groupby to be stored fields