首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Django的views.py中应用循环

如何在Django的views.py中应用循环
EN

Stack Overflow用户
提问于 2022-02-15 01:16:43
回答 2查看 107关注 0票数 0

研究/模型

代码语言:javascript
复制
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语句的解决方法吗?

研究/观点

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
<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语句?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-15 02:00:38

您可以通过创建参数字典并在向**传递时解压该字典,从而将动态关键字参数构建为函数。

循环遍历您的类型,并为每个类型的注释创建键和值。

还可以将创建的动态注释解压缩为字段名,以便使用values()传递给*

代码语言:javascript
复制
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())
票数 0
EN

Stack Overflow用户

发布于 2022-02-15 02:07:32

Kwargs可以作为dict传递,所以您所需要做的就是用以下键创建一个dict : value对。

你可以这样做:

代码语言:javascript
复制
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
})
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71120104

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档