【问题标题】:Django: looping through multiple dictionaries in a template - or finding a better wayDjango:在模板中循环多个字典 - 或找到更好的方法
【发布时间】:2014-09-22 19:09:09
【问题描述】:

我有一个学校注册应用程序,正在尝试创建一个基于网络的报告,其中列出了一个学期的每个班级、教师、助教和学生。

您可以在下面看到我正在创建一个字典,其中键设置为班级名称,值设置为学生列表。但是,我需要为助手做同样的事情。

我可以为每个班级的助手创建类似的东西(每个班级的助手可能为零到无限),但我不确定在那之后该怎么做,我认为这不是传递数据的最佳方式到模板。

如果我有一个 student_dict 和一个 assistant_dict 传递给模板,我该如何循环它们?我似乎找不到过滤字典键的方法,所以我不能循环遍历助手列表,然后创建一个将 assistant_dict[course] 与 student_dict[course] 匹配的内部循环。或者,也许我可以也无法弄清楚。

或者,也许有一个更简单的方法来解决这个问题。

感谢您提供的任何建议。

schedule = Schedule.objects.filter(semester__name='2014 Fall').prefetch_related()
schedule_list = schedule.values_list('course_catalog__course_name', flat=True).order_by('semester_period__name')
student_dict=dict([(schedule_list,[]) for schedule_list in list(schedule_list)])

student_enrolls = StudentEnroll.objects.filter(schedule__semester__name = '2014 Fall').values_list('student__family_member__first_name', 'student__family_member__last_name', 'schedule__course_catalog__course_name')

for (fname, lname, course) in student_enrolls:
    student_dict[course].append(fname + ' ' + lname)
for k in student_dict.keys():
    student_dict[k].sort()

【问题讨论】:

  • 你能展示你的模型为每个和相关的外键字段吗?
  • 你为什么需要这些字典?为什么不循环遍历班级,并通过现有关系为每个班级输出学生和助手?

标签: django


【解决方案1】:

好吧,我会把这个概念改成课程词典。然后对于每个项目的值,它将有另一个字典,一个键是学生列表,另一个键是助手列表。

所以你的课程词典应该是这样的:

{
    "course_id_1": {
        "students": [],
        "assistants": [],
    },
    "course_id_2": {
        "students": [],
        "assistants": [],
    }
}

假设您添加助手的方式与添加学生的方式相同,您可以执行以下操作:

for (fname, lname, course) in student_enrolls:
    courses[course]['students'].append(fname + ' ' + lname)
for (fname, lname, course) in assistants:
    courses[course]['assistants'].append(fname + ' ' + lname)
for k in courses.keys():
    courses[k]['students'].sort()
    courses[k]['assistants'].sort()

话虽如此,您可以通过订购注册对象然后删除 .sort() 调用来提高解决方案的性能

【讨论】:

  • 这看起来很简单。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-05-15
  • 2011-09-19
  • 2018-09-22
  • 1970-01-01
  • 2020-08-03
  • 2012-08-17
  • 2015-11-25
  • 2016-08-31
相关资源
最近更新 更多