#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 если это ответ на ваш вопрос, пожалуйста, подумайте о том, чтобы отметить его как правильный ответ, это может помочь другим, у которых та же проблема