Как оптимизировать код с помощью оператора for при рендеринге в django views.py

Я использую django, и приведенный ниже код работает неэффективно. Есть ли способ сократить метод создания и добавления списка с помощью оператора for, как в коде ниже? Список используется для создания графиков в apex chart javascript.

[views.py]

annotations = {}
types = ('A', 'B', 'C', 'D', 'E', 'F')
for type in types:
    annotations[type] = Count('id', filter=Q(type=type))
    annotations[f'r_{type}'] = Count('id', filter=Q(type=type, is_recruiting='Recruiting'))
    annotations[f'N_{type}'] = Count('id', filter=Q(type=type, is_recruiting='Not yet recruiting'))
    annotations[f'H_{type}'] = Count('id', filter=Q(type=type, is_recruiting='Holding'))
    annotations[f'C_{type}'] = Count('id', filter=Q(type=type, is_recruiting='Completed'))
    counts = Research.objects.values('teacher').annotate(**annotations).values('teacher', *annotations.keys())

teacher = [];
A = [];
B= [];
C= [];
D= [];
E= [];
F= [];
r_A = [];
r_B = [];
r_C = [];
r_D = [];
r_E = [];
r_F = [];
...
C_E = [];
C_F = [];
for count in counts:
    teacher.append(str(count['teacher']))
    A.append(str(count['A']))
    B.append(str(count['B']))
    C.append(str(count['C']))
    D.append(str(count['D']))
    E.append(str(count['E']))
    F.append(str(count['F']))
    r_A.append(str(count['r_A']))
    r_B.append(str(count['r_B']))
    r_C.append(str(count['r_C']))
    r_D.append(str(count['r_D']))
    r_E.append(str(count['r_E']))
    r_F.append(str(count['r_F']))
    ...
    C_E.append(str(count['C_E']))
    C_F.append(str(count['C_F']))

return render(request, 'graph.html',
              {
                  'teacher': teacher,
                  'A': A,
                  'B': B,
                  'C': C,
                  'D': D,
                  'E': E,
                  'F': F, 
                  'r_A': r_A,
                  'r_B': r_B,
                  'r_C': r_C,
                  'r_D': r_D,
                  'r_E': r_E,
                  'r_F': r_F,
                  ...
                  'C_E': C_E,
                  'C_F': C_F     
              })

[graph.html]

series: [{% if is_recruiting == 'Recruiting' %}
    {
      name: 'A',
      data: {{ r_A | safe }}
    }, {
      name: 'B',
      data: {{ r_B | safe }}
    }, {
      name: 'C',
      data: {{ r_C | safe }}
    }, {
      name: 'D',
      data: {{ r_D | safe }}
    }, {
      name: 'E',
      data: {{ r_E | safe }}
    }, {
      name: 'F',
      data: {{ r_F | safe }}
    },{% elif is_recruiting == 'ALL' %}
    {
      name: 'A',
      data: {{ A | safe }}
    }, {
      name: 'B',
      data: {{ B | safe }}
    }, {
      name: 'C',
      data: {{ C | safe }}
    }, {
      name: 'D',
      data: {{ D | safe }}
    }, {
      name: 'E',
      data: {{ E | safe }}
    }, {
      name: 'F',
      data: {{ F | safe }}
    }, ... {% elif is_recruiting == 'Completed' %}
    {
      name: 'A',
      data: {{ C_A | safe }}
    }, {
      name: 'B',
      data: {{ C_B | safe }}
    }, {
      name: 'C',
      data: {{ C_C | safe }}
    }, {
      name: 'D',
      data: {{ C_D | safe }}
    }, {
      name: 'E',
      data: {{ C_E | safe }}
    }, {
      name: 'F',
      data: {{ C_F | safe }}
    },{% endif %}
    ],

Это javascript, который создает график с помощью apexchart.js. Эта часть также продолжает код с оператором if, поэтому читабельность не очень хорошая. Есть ли способ сократить и эту часть?

Что-то вроде:

for count in counts:
    teacher.append(str(count['teacher']))
    A.append(str(count['A']))
    B.append(str(count['B']))
    C.append(str(count['C']))
    D.append(str(count['D']))
    E.append(str(count['E']))
    F.append(str(count['F']))

можно переписать, используя дикту, а не несколько списков:

count_dict = defaultdict(list)
for type_, count in itertools.product(types, counts):
    count_dict[type_].append(str(count[type_]))

(причина, по которой это type_, а не type в том, что type - зарезервированное слово... просто выберите другое имя переменной, например t, если вам не нравится подчеркивание)

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