研究/模型
RECRUITING_CHOICES = [
('Recruiting', 'Recruiting'),
('Not yet recruiting', 'Not yet recruiting'),
('Completed', 'Completed'),
('Holding', 'Holding'),
]
RECRUITING_CHOICES_INV = {val: val for val, _ in RECRUITING_CHOICES}
class Research(models.Model):
is_deleted = models.BooleanField(default=False)
is_recruiting = models.CharField(choices=RECRUITING_CHOICES, null=True, max_length=50)
research_name = models.CharField(max_length=2000, null=True)
teacher= models.CharField(max_length=2000, null=True)我正在使用Django,并且我试图创建一个列表,用于使用类模型'Research‘在views.py中生成顶点图(图)。
我试图将is_recruiting字段的4个值()中的每个值添加到筛选中,但是添加招聘(而不是招聘)只需使用多行代码,使代码看起来效率低下。有使用for语句的解决方法吗?
研究/观点
counts = Research.objects.values('teacher') \
.annotate(A=Count('id', filter=Q(type='A')),
B=Count('id', filter=Q(type='B')),
C=Count('id', filter=Q(type='C')),
D=Count('id', filter=Q(type='D')),
E=Count('id', filter=Q(type='E')),
F=Count('id', filter=Q(type='F')),
r_A=Count('id', filter=Q(type='A', is_recruiting='Recruiting')),
r_B=Count('id', filter=Q(type='B', is_recruiting='Recruiting')),
r_C=Count('id', filter=Q(type='C', is_recruiting='Recruiting')),
r_D=Count('id', filter=Q(type='D', is_recruiting='Recruiting')),
r_E=Count('id', filter=Q(type='E', is_recruiting='Recruiting')),
r_F=Count('id', filter=Q(type='F', is_recruiting='Recruiting')),
N_A=Count('id', filter=Q(type='A', is_recruiting='Not yet recruiting')),
N_B=Count('id', filter=Q(type='B', is_recruiting='Not yet recruiting')),
N_C=Count('id', filter=Q(type='C', is_recruiting='Not yet recruiting')),
N_D=Count('id', filter=Q(type='D', is_recruiting='Not yet recruiting')),
N_E=Count('id', filter=Q(type='E', is_recruiting='Not yet recruiting')),
N_F=Count('id', filter=Q(type='F', is_recruiting='Not yet recruiting'))) \
.values('teacher', 'A', 'B', 'C', 'D', 'E', 'F',
'r_A', 'r_B', 'r_C', 'r_D', 'r_E', 'r_F',
'N_A', 'N_B', 'N_C', 'N_D', 'N_E', 'N_F')views.py - ADD
teacher = [];
A= [];
B= [];
C= [];
D= [];
E= [];
F= [];
r_A = [];
r_B = [];
r_C = [];
r_D = [];
r_E = [];
r_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']))
Ftc.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']))
is_recruiting = request.GET.get('is_recruiting')graph.html
<script>
var options3 = {
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 }}
},{% endif %}
],
</script>我是否必须在JavaScript部分中一次又一次地列出if语句?
发布于 2022-02-15 02:00:38
您可以通过创建参数字典并在向**传递时解压该字典,从而将动态关键字参数构建为函数。
循环遍历您的类型,并为每个类型的注释创建键和值。
还可以将创建的动态注释解压缩为字段名,以便使用values()传递给*。
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'))
counts = Research.objects.values('teacher').annotate(**annotations).values('teacher', *annotations.keys())发布于 2022-02-15 02:07:32
Kwargs可以作为dict传递,所以您所需要做的就是用以下键创建一个dict : value对。
你可以这样做:
recruiting_values = (
("", dict()),
("r_", dict(is_recruting="Recruiting")),
("n_", dict(is_recruting="Not"),
)
types = ("A", "B", "C")
...
.annotate(**{
f"{prefix}{type}": Count("id", filter=Q(type=type, **recruiting)) for prefix, recruiting in recruiting_value for type in types
})https://stackoverflow.com/questions/71120104
复制相似问题