是否有有效的方法将数据结构到python列表或元组中
是否有任何方法可以构造从数据库中获取的数据,目前我使用append,但当获取的数据超过1k时,它会变得很慢是否有有效的方法将数据结构到python列表或元组中,python,django,list,django-queryset,Python,Django,List,Django Queryset,是否有任何方法可以构造从数据库中获取的数据,目前我使用append,但当获取的数据超过1k时,它会变得很慢 courses = [] for i in departments: for course in i.course_set.all(): course = [course.name] info_list = [] for year in range(1, 5): info = [year, (['Regular
courses = []
for i in departments:
for course in i.course_set.all():
course = [course.name]
info_list = []
for year in range(1, 5):
info = [year, (['Regular'], ['Irregular'])]
info_list.append(info)
count = 0
for gender in ['male', 'female']:
regular = students.filter(year_level=year, status='regular', course=course, gender=gender).count()
irregular = students.filter(year_level=year, status='irregular', course=course, gender=gender).count()
info[1][0].append(regular)
info[1][1].append(irregular)
regular = students.filter(year_level=year, status='regular', course=course, gender=gender).count()
irregular = students.filter(year_level=year,status='irregular', course=course, gender=gender).count()
info[1][0].append(regular)
info[1][1].append(irregular)
info[1][2].append(cross)
total = regular + irregular
count += total
info.append(count)
program.append(info_list)
male = students.filter(gender='male', course=course).count()
female = students.filter(gender='female', course=course).count()
overall = students.filter(gender=None), course=course).count()
program.append(["", "Total", "", male, female, overall, overall])
courses.append(program)
我不确定是追加还是查询在数据库中多次命中。在我得到它之后,我将使用它将数据输出到pdf表中您所经历的低效不是来自您用来处理数据的Python结构或过程,而是来自您使用多个循环和查询来使用django获取数据的方式。我可能不完全了解您正在处理的数据,但从我所看到的情况来看,您基本上是在尝试对每个类别的学生总数(性别、地位、课程等)进行细分,然后获得小计和总数 更好的方法是只使用一两个django查询,让数据库为您完成大部分工作。然后,可以在python的内存中处理结果,以获得小计 例如,假设您需要按性别、身份、课程名称和年份对学生人数进行细分。您可以通过一次调用从数据库获取此数据:
results=list(Student.objects.value('year\u level'、'status'、'course\u name'、'gender')。注释(total=Count('id'))
结果
将包含一个字典列表,如下所示:
结果=[
{'year_level':1,'status':'regular','course_name':'course A','gender':'female','total':2},
{'year_level':1,'status':'regular','course_name':'course A','gender':'male','total':2},
{'year_level':2,'status':'regular','course_name':'course B','gender':'female','total':1},
{'year_level':2,'status':'regular','course_name':'course B','gender':'male','total':1},
{'year_level':3,'status':'regular','course_name':'course C','gender':'male','total':1}
]
因此,对于分类中的每一个变化,您都会得到一个总数。然后,如果要将这些数据合并到小计中,可以使用reduce
从结果中快速获取这些数据:
男学生=减少(
lambda总计,结果:总计+(如果结果['gender']='male'否则为0,则结果['total'],
结果,初始值=0
)
女学生=减少(
lambda总计,结果:总计+(如果结果['SENDE']=='female'否则为0,则结果['total'],
结果,初始值=0
)
所有学生=减少(lambda总数,结果:总数+结果['total',结果,0)
另一个按年份细分的示例:
students\u按年级={1:{},2:{},3:{},4:{}
对于范围(1,5)内的年份:
学生按年[年][男性]=减少(
lambda总计,结果:总计+(结果['total']
如果结果['gender']=='male'和结果['year_level']==年份其他0
),结果,初始值=0)
学生按年[年][女性]=减少(
lambda总计,结果:总计+(结果['total']
如果结果['gender']='female'和结果['year_level']==年份其他0
),结果,初始值=0)
修改lambda函数中一个或多个特定条件的“if”条件将得到小计
无论使用何种技术处理结果,在python结果中使用的词典列表所做的工作以及如何使用这些词典,此时都会更快。效率低下的根源是您循环处理django查询结果并逐个对数据库进行多个查询的方式
如果您的数据集非常大(可能有几十万名学生),那么为您需要的特定小计单独构造django查询会更有效,例如:
main_students_by_year=list(Student.objects.filter(gender='male')。value('year_level')。注释(total=Count('id'))
以上内容将为您提供以下结果:
[
{'year_level':1,'total':2},
{'year_level':2,'total':1},
{'year_level':3,'total':1}
]
希望这能有所帮助,如果以上任何一项需要澄清,请告诉我。您遇到的低效不是来自处理数据所使用的Python结构或过程,而是来自您使用多个循环和查询来使用django获取数据的方式。我可能不完全了解您正在处理的数据,但从我所看到的情况来看,您基本上是在尝试对每个类别的学生总数(性别、地位、课程等)进行细分,然后获得小计和总数 更好的方法是只使用一两个django查询,让数据库为您完成大部分工作。然后,可以在python的内存中处理结果,以获得小计 例如,假设您需要按性别、身份、课程名称和年份对学生人数进行细分。您可以通过一次调用从数据库获取此数据:
results=list(Student.objects.value('year\u level'、'status'、'course\u name'、'gender')。注释(total=Count('id'))
结果
将包含一个字典列表,如下所示:
结果=[
{'year_level':1,'status':'regular','course_name':'course A','gender':'female','total':2},
{'year_level':1,'status':'regular','course_name':'course A','gender':'male','total':2},
{'year_level':2,'status':'regular','course_name':'course B','gender':'female','total':1},
{'year_level':2,'status':'regular','course_name':'course B','gender':'male','total':1},
{'year_level':3,'status':'regular','course_name':'course C','gender':'male','total':1}
]
因此,对于分类中的每一个变化,您都会得到一个总数。然后,如果要将这些数据合并到小计中,可以使用reduce
从结果中快速获取这些数据:
男学生=减少(
lambda总计,结果:总计+(结果['total