Как получить общее количество заданий каждого типа в Django?

У меня есть 1 таблица для задач, эти задачи могут быть в 3 статусах "todo", "in-progress" и "done", я хочу подсчитать общее количество задач каждого статуса, и поместить его в массив типа ('todo итого", "прогресс итого", "сделано итого"), есть идеи, как я могу этого добиться? Моя конечная цель состоит в том, чтобы отобразить 3 промежуточных итога в Chartjs, Спасибо заранее.

models.py

'''

class Todo(models.Model):

status_option = (
    ('to_do', 'to_do'),
    ('in_progress', 'in_progress'),
    ('done', 'done'),
)
status = models.CharField(max_length=20, choices=status_option, default='to_do')
# todo_list's content
team = models.ForeignKey('Team', on_delete=models.CASCADE)
project = models.ForeignKey(Project, on_delete=models.CASCADE)
name = models.CharField(max_length=20)
create_date = models.DateTimeField(auto_now_add=True)
start_date = models.DateTimeField(default=datetime.datetime.now)
due_date = models.DateTimeField(default=datetime.datetime.now)

project_code = models.CharField(max_length=20)
details = models.TextField()

def __str__(self):
    return self.status
    # return self.team['team'].queryset

def update_status(self):
    if self.status == 'to_do':
        self.status = 'in_progress'
    elif self.status == 'in_progress':
        self.status = 'done'
    self.save()

'''

Если вы хотите посчитать один статус сам по себе, вы можете сделать следующее:

to_do_count = Todo.objects.filter(status='to_do').count()

Если вам нужен словарь, подсчитывающий каждый статус, вы можете сделать следующее:

from django.db.models import Case, When

counts_data = Todo.objects.aggregate(
                  to_do_count=Count(Case(When(status='to_do', then=1))),
                  in_progress_count=Count(Case(When(status='in_progress', then=1))),
                  done_count=Count(Case(When(status='done', then=1))),
              )

или так:

from django.db.models import Q

counts_data = Todo.objects.aggregate(
            to_do_count = Count('pk', filter=Q(status='to_do')),
            in_progress_count = Count('pk', filter=Q(status='in_progress')),
            done_count = Count('pk', filter=Q(status='done'))
        )
Вернуться на верх