Skip to main content

strawberry-django-aggregates

Hasura-shape aggregations over Django querysets in Strawberry GraphQL.

count · count_distinct · sum · avg · min · max · stddev · variance · bool_and · bool_or · array_agg · string_agg — composed with multi-level group_by, having filters, and ordering on aggregate aliases. Inspired by Hasura's <table>_aggregate, PostGraphile's pg-aggregates, and Odoo 18's _read_group. Built for strawberry-django over PostgreSQL and SQLite.

from decimal import Decimal
from datetime import datetime
from strawberry import auto
import strawberry, strawberry_django
from strawberry_django_aggregates import AggregateBuilder

from .models import Order

@strawberry_django.type(Order)
class OrderType:
    id: auto
    customer: "CustomerType"
    total: Decimal
    status: str
    created_at: datetime

# One call wires count/sum/avg/min/max + group_by + having into the schema:
order_aggs = AggregateBuilder(
    model=Order,
    aggregate_fields=["total"],
    group_by_fields=["customer", "status", "created_at"],
).build()

@strawberry.type
class Query:
    orders_aggregate = order_aggs.aggregate_field
    orders_group_by  = order_aggs.group_by_field

Generates a fully-typed GraphQL surface:

type Query {
  ordersAggregate(filter: OrderFilter): OrderAggregate!
  ordersGroupBy(
    filter:    OrderFilter
    groupBy:   [OrderGroupBySpec!]!
    having:    OrderHaving
    orderBy:   [OrderGroupOrder!]
    pagination: OffsetPagination
  ): OrderGroupedResult!
}

type OrderAggregate {
  count:           Int!
  countDistinct(field: OrderCountableField!): Int!
  sum:             OrderSumFields
  avg:             OrderAvgFields
  min:             OrderMinFields
  max:             OrderMaxFields
  stddev:          OrderStddevFields    # Postgres only
  variance:        OrderVarianceFields  # Postgres only
}

type OrderGrouped {
  key:   OrderGroupKey!   # composite — every requested groupBy field present
  count: Int!
  sum:   OrderSumFields
  # ... no recursive subgroups field — flat results
}

Features

  • Hasura-canonical schema shape. <Model>Aggregate { count, countDistinct, sum, avg, min, max, stddev, variance, boolAnd, boolOr, arrayAgg, stringAgg }.
  • Odoo-grade group-by. Multi-level via composite keys (flat result rows), dual date-granularity tracks (date_trunc returning DateTime AND date_part::int returning Int), timezone-correct bucketing.
  • HAVING with aggregate aliases. { countGt: 5, sumTotalGt: 1000 } — typed inputs generated per measure.
  • Ordering on aggregates. [{ field: "total:sum", direction: DESC }] — fail-loud on unknown terms (Odoo's pre-17 silent-drop bug avoided).
  • Standalone backend primitive. compute_aggregation(qs, group_by, aggregates, having, order_by, ...) is callable from any Python context — DRF view, Celery task, admin script, MCP tool — not just GraphQL resolvers.
  • Exact group cardinality. AggregateBuilder.count_groups(...) returns the database-side group count before pagination for custom grouped envelopes, including filters, granularity, JSON paths, and HAVING.
  • Determinism. Type generation produces byte-identical SDL for the same inputs.
  • No magic. Every operator, every granularity, every type is whitelisted.

Non-goals

  • Cross-database aggregation. PostgreSQL + SQLite only. SQLite degrades gracefully on array_agg/string_agg/stddev/variance — those operators raise OperatorNotSupportedError at resolver entry.
  • Auto-traversal of one-to-many / many-to-many for measures. This is the silent row-multiplication footgun Odoo refuses to ship; we follow. array_agg is the explicit escape hatch.
  • Permission integration. The library expects a pre-scoped queryset — the caller has already applied accessible_by(user) or equivalent. This keeps the library compatible with django-guardian, django-rules, django-rebac (when shipped), or hand-rolled permission systems.

Status

Beta (v0.10.0). The schema shape, operator vocabulary, and compute_aggregation signature are stable for early adopters, but minor-level iteration is still expected before a 1.0 stability commitment — see docs/SPEC.md § 16. Runtime: Python 3.14, Django 6.0.

Documentation

  • Full contract: docs/SPEC.md — operator catalog, granularity tracks, HAVING semantics, ordering rules, timezone handling, and the Odoo-derived footgun audit.
  • Naming and wire vocabulary: docs/TERMINOLOGY.md
  • Contributor quality gate: CONTRIBUTING.md

License

BSD-3-Clause.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

strawberry_django_aggregates-0.10.0.tar.gz (156.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

strawberry_django_aggregates-0.10.0-py3-none-any.whl (103.9 kB view details)

Uploaded Python 3

File details

Details for the file strawberry_django_aggregates-0.10.0.tar.gz.

File metadata

File hashes

Hashes for strawberry_django_aggregates-0.10.0.tar.gz
Algorithm Hash digest
SHA256 2fcefd7407f7e03c0cb07951c008b6009edd85d0aac9b757a205b983d0b74075
MD5 04523eed82475ded06f0980bc5dbf1cd
BLAKE2b-256 30b79c05a9b8fc9f96e13525ea186b43006b8fc0ecde016843bf06c30d08d0f6

See more details on using hashes here.

File details

Details for the file strawberry_django_aggregates-0.10.0-py3-none-any.whl.

File metadata

File hashes

Hashes for strawberry_django_aggregates-0.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 f7e7c7a14640b16eb676a81313ff1f7a15e92894c244b54bc57cf3f8481a8397
MD5 a011d2f0e9333cfb139c5ea3c0d27cd1
BLAKE2b-256 694c01d90711859050e97e7d566d43697a324b8b16ce53437569fbee9aa12d9c

See more details on using hashes here.

Release history Release notifications | RSS feed

0.12.0

2 files

0.11.0

2 files

This release

0.10.0 This release

2 files

0.9.1

2 files

0.8.0

2 files

0.7.0

2 files

0.6.1

2 files

0.6.0

2 files

0.5.0

2 files

0.4.1

2 files

0.4.0

2 files

0.3.0

2 files

0.2.2

2 files

0.2.1

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page