Django Queryset - Получение подсчетов по model.choices

У меня есть модель, в которой есть все данные о клиенте Leads. Клиент хочет видеть статусы своих последующих действий Leads.

class FollowUp(models.Model):
    CALL_CHOICES = [("0", "Call Unanswered"),
                  ("1", "Call Later"),
                  ("2", "Visit Scheduled"),
                  ("3", "Not Visited"),
                  ("4", "Not reachable"),
                  ("5", "Wrong Number"),
                  ("6", "Not Interested"),
                  ("7", "Deal Closed")]
    status = models.CharField(_("Call Status"),
            max_length = 20,
            choices = CALL_CHOICES,
            default = '1'
        )
    next_action_on = DateTimeField(_("Next Action"), auto_now_add=False, 
                null=True, blank=True)
    reminder = models.BooleanField(_("reminder"), default=False)  
    created = models.DateTimeField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)

class Lead(models.Model):
    followups = models.ManyToManyField(FollowUp, verbose_name=_("Follow up"), blank=True)
    ...

Как я могу получить Lead подсчеты каждого status выбора. например

{
 'Call Unanswered': 12 #Leads, 
 'Call Later': 10 # Leads  
 'Visit Scheduled': 20, #Leads, 
 ...
} 

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

>>> Leads.objects.filter(follow_up__status=0).count()
>>> 10

Я думаю, что вы можете использовать итератор for для итерации по CALL_CHOICES и фильтрации строк на основе статуса.

queryset = Leads.objects.all()
res = {}
for i in FollowUp.CALL_CHOICES:
    res[i[1]] = queryset.filter(status=i[0]).aggregate(follows__total=Count('status'))['total']
print(res)

В конце сценария вы получите каждую пару значений.

Попробуйте это:

Lead.objects.aggregate(
    **{
        choice[1]: Count(
            'followups', filter=Q(followups__status=choice[0])
        ) for choice in Followup.CALL_CHOICES
    }
)

Это вернет что-то вроде:

{'Call Unanswered': 0,
 'Call Later': 0,
 'Visit Scheduled': 0,
 'Not Visited': 0,
 'Not reachable': 0,
 'Wrong Number': 0,
 'Not Interested': 0,
 'Deal Closed': 0}
Вернуться на верх