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

#python #django #django-rest-framework #orm

#питон #джанго #django-rest-фреймворк #орм

Вопрос:

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

 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}]  

Активные, Выигранные и Проигранные-это значения поля СТАТУСА в модели потенциальных клиентов. Там также есть еще один, и я хотел бы создать пару ключей и значений для каждого из них для каждого пользователя (CharField)

Комментарии:

1. Можете ли вы поделиться своей моделью?

2. Я не могу поделиться всей причиной, по которой мне не разрешено, но похоже, что это поле статуса из перечисления : Status =[ (Leadstatus. ACTIVE.значение, «Активный»),(Leadstatus.ВЫИГРАЛ.значение, «Выиграл»)] и еще несколько статусов

3. Является created_by ли внешний ключ? Только эта часть модели могла бы помочь

4. Да, это внешний ключ, который я использую, созданный_по__имени, чтобы получить его имя, извините, забыл упомянуть об этом

Ответ №1:

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

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

 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} )  

Комментарии:

1. Спасибо за Вашу помощь, но я пытаюсь найти способ не жестко кодировать значения статуса, если это возможно

2. @KarolSawicki хорошо, есть ли в поле статуса варианты, которые можно использовать для создания полей, или вам нужно получить их из базы данных?

3. да, это поле выбора из перечисления

4. @KarolSawicki обновил ответ способом динамического создания аннотаций с использованием перечисления

5. @KarolSawicki если это ответ на ваш вопрос, пожалуйста, подумайте о том, чтобы отметить его как правильный ответ, это может помочь другим, у которых та же проблема