是否有有效的方法将数据结构到python列表或元组中

是否有有效的方法将数据结构到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

是否有任何方法可以构造从数据库中获取的数据,目前我使用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'], ['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