在Django Rest Framework中,现在有一个Exam模型里面有student=models.ForeignKey字段和title = models.CharField字段,还有一个TestPaper模型里面有student = models.ForeignKey字段和存放成绩的 score = models.IntegerField字段和exam = models.ForeignKey字段, 还有一个Student模型里面有name = models.CharField字段,现在需要在views.py中写入一个功能,通过接口调用,用来将指定title的所有exam中的学生最高的分数export成excel,第一列为考试title,第二列为考生姓名,第三列为考生成绩,尽量使用pandas 来做,并加上详细注释
时间: 2024-03-28 09:42:16 浏览: 75
首先需要安装pandas库,可以通过pip install pandas来进行安装。
在views.py中可以这样实现:
```python
import pandas as pd
from django.http import HttpResponse
from rest_framework.decorators import api_view
from .models import Exam, TestPaper, Student
@api_view(['GET'])
def export_excel(request, title):
# 获取指定title的所有exam
exams = Exam.objects.filter(title=title)
# 获取所有学生和其姓名
students = Student.objects.all()
student_dict = {}
for student in students:
student_dict[student.id] = student.name
# 获取每个学生在指定title的所有exam中的最高分数
scores = {}
for exam in exams:
test_papers = TestPaper.objects.filter(exam=exam)
for test_paper in test_papers:
student_id = test_paper.student_id
if student_id not in scores:
scores[student_id] = test_paper.score
else:
scores[student_id] = max(scores[student_id], test_paper.score)
# 构建DataFrame
data = []
for student_id, score in scores.items():
data.append([title, student_dict[student_id], score])
df = pd.DataFrame(data, columns=['title', 'student', 'score'])
# 将DataFrame转成Excel文件
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment; filename="{}.xlsx"'.format(title)
df.to_excel(response, index=False)
return response
```
这个函数接受一个title参数,用来指定要导出的考试的title。首先获取指定title的所有exam,然后获取所有学生和其姓名。接着遍历每个指定title的exam下的所有test paper,记录每个学生的最高分数。最后将数据构建成DataFrame,然后通过to_excel方法将其转成Excel文件并返回HttpResponse。
阅读全文