Django представления с фильтром и агрегацией

Имеются 2 связанные модели:

  • Сотрудники (имеется внешний ключ на Подразделения)
  • Подразделения

Сотрудники имеют статусы:

  • Действующий
  • Уволенный

Подразделения имеют названия:

  • Подразделение № 1
  • Подразделение № 2

В итоге мне нужны вывести шаблон с такой таблицей:

Подразделение Кол-во всех сотрудников Кол-во действующих Кол-во уволенных
Подразделение № 1 20 15 5
Подразделение № 2 30 25 5
Подразделение № 3 20 15 5
Подразделение № 4 30 25 5
Подразделение № 5 20 15 5
Подразделение № 6 30 25 5

В представлении (views) я использую примерно такой Класс для попытки реализации данной таблицы:

class AnalyticsView(ListView):
    model = Сотрудники

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # Выбираю всех сотрудников с группировкой для определения количества
        context['сотрудники_все'] = Сотрудники.objects.all().annotate(cnt=Count('id'))
        # Выбираю действующих сотрудников с группировкой для определения количества
        context['сотрудники_действующие'] = Сотрудники.objects.filter(Действующий=True).annotate(cnt=Count('id'))
        # Выбираю действующих сотрудников с группировкой для определения количества
        context['сотрудники_уволенные'] = Сотрудники.objects.filter(Уволенный=True).annotate(cnt=Count('id'))
        # Выбираю все подразделения
        context['Подразделения'] = Подразделения.objects.all()
        return context

Далее в Шаблоне я пытаюсь реализовать таблицу:

<table>
       <tr>
           <th>Подразделение</th>
           <th>Кол-во всех сотрудников</th>
           <th>Кол-во действующих</th>
           <th>Кол-во уволенных</th>
       </tr>
       {% for П in Подразделения %}
        <tr>
            <td>
                {{ П.название подразделения }}
            </td> 
             <td>
                  Проблемное место для вывода количества всех сотрудников
             </td>
             <td>
                  Проблемное место для вывода количества действующих сотрудников
             </td>
             <td>
                  Проблемное место для вывода количества уволенных сотрудников
             </td>
        </tr>
       {% endfor %}
</table>

В реальности подразделений намного больше и вручную в Представлении (views) в Классе "AnalyticsView(ListView)" не реально учесть все подразделения с привязкой по названию и выбором разных статусов Сотрудников.

По факту мне хочется сделать так, чтобы можно было проитерировать список всех подразделений, из которого получить первое, например "Подразделение № 1", далее подсчитать количество сотрудников с учетом выбранного подразделения по трем фильтрами: 1. Все, 2. Действующие 3. Уволенные.

Вернуться на верх