Как оптимизировать код с помощью оператора 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, если вам не нравится подчеркивание)