Сложная аннотация для получения всех статусов для каждого подсчитанного пользователя

В моей таблице leads мне нужно подсчитать количество leads для каждого статуса для каждого пользователя. Есть ли способ сделать это с помощью arm annotate? Сейчас у меня есть что-то вроде этого:

leads.objects.values("created_by", "status").annotate(total=Count("status")).order_by("created_by")

и вывод выглядит так:

[{'created_by':'Andrew Ray', 'status':'ACTIVE', 'total':4}, {'created_by':'Andrew Ray', 'status':'LOST', 'total':2}, {'created_by':'Andrew Ray', 'status':'WON', 'total':1}]

есть ли способ получить его следующим образом:

[{"created_by": "Andrew Ray", "ACTIVE": 4, "LOST": 2, "WON": 1}]

Active Won Lost являются значениями поля STATUS в модели leads, есть еще одно, и я хотел бы сделать ключ и значение pai для каждого из них для каждого пользователя (CharField)

Не зная вашей модели, должно сработать что-то вроде следующего.

Создайте набор значений по уникальному полю (created_by) и упорядочьте по этому полю. Затем вы аннотируете кверисет подсчетами, которые фильтруются по статусу, который вы хотите подсчитать по уникальному полю. Мы можем строить аннотации динамически, используя значения из перечисления choices, создавая и затем распаковывая dict со всеми choices для передачи подсчетов в качестве ключевых слов

from django.db.models import Count, Q

Leads.objects.order_by(
    'created_by'
).values(
    'created_by'
).annotate(
    total=Count('pk'),
    **{choice: Count('pk', filter=Q(status=choice)) for choice in Leads.StatusEnum.values}
)
Вернуться на верх