Django aggregate и annotate для подсчета по группам - несколько уровней

У меня есть модель, которая выглядит следующим образом:

class Foo(models.Model):
    bar = models.CharField(...)
    baz = models.CharField(...)

Foo(bar="a", baz="x")
Foo(bar="a", baz="x")
Foo(bar="a", baz="y")
Foo(bar="b", baz="y")

И я хочу получить набор запросов, который вернет наибольшее количество уникальных пар (bar, baz) для каждого bar:

[
    {"bar": "a", "baz": "x", "count": 2},
    {"bar": "b", "baz": "y", "count": 1},
]

Идеально это все будет сделано в запросе, я пробовал комбинации distinct, aggregate, annotate, безрезультатно и не вижу, как это сделать, кроме как запустить сырой SQL, чего я хочу избежать.

Я использую PostgreSQL в качестве бэкенда базы данных.

API абстракции баз данных в Django довольно мощный, и чаще всего я находил возможность добиться необходимых результатов даже для самых сложных запросов. Поначалу это может сбить с толку, но при правильном использовании аннотаций можно добиться многого.

https://docs.djangoproject.com/en/4.0/topics/db/aggregation/#values

Я смог добиться результатов с помощью Django values, annotate и Count:

from django.db.models import Count
from .models import Foo

Foo.objects.all().values('bar','baz').annotate(count=Count('id')).order_by('-count')
Вернуться на верх