在Django Rest Framework中,现在有一个Exam模型里面有student=models.ForeignKey字段和title = models.CharField字段,还有一个TestPaper模型里面有student = models.ForeignKey字段与存放成绩的 score = models.IntegerField字段,现在需要在views.py中写入一个功能,用来将指定exam(通过title进行筛选)中的多个学生的成绩导出成excel,第一行为考试title,第二行为考生姓名,第三行为考生成绩,尽量使用pandas 来做
时间: 2024-03-20 11:40:04 浏览: 63
好的,我会根据你的要求回答你的问题。
首先,你可以在views.py中定义一个导出excel的函数,代码如下:
```python
import pandas as pd
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from .models import Exam, TestPaper
def export_exam_scores(request, title):
exam = get_object_or_404(Exam, title=title)
test_papers = TestPaper.objects.filter(student__exam=exam)
# 获取考试成绩表
scores = []
students = []
for test_paper in test_papers:
scores.append(test_paper.score)
students.append(test_paper.student.name)
# 生成DataFrame
data = {'考试名称': [title], '考生姓名': students, '考生成绩': scores}
df = pd.DataFrame(data)
# 导出excel
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = f'attachment; filename="{title}.xlsx"'
df.to_excel(response, index=False)
return response
```
在上述代码中,我们首先通过传入的title获取对应的Exam对象,然后筛选出该考试下的所有TestPaper对象。接着,我们遍历TestPaper对象,获取考生姓名和考试成绩,并将其存储在两个列表中。然后,我们创建一个字典,将考试名称、考生姓名和考试成绩存储在其中,用于生成DataFrame。最后,我们将DataFrame导出成excel,并返回HttpResponse对象,以供用户下载。
在urls.py中,你可以将该函数与一个url进行绑定,以便用户访问。例如:
```python
from django.urls import path
from . import views
urlpatterns = [
path('export_exam_scores/<str:title>/', views.export_exam_scores, name='export_exam_scores'),
]
```
当用户访问/export_exam_scores/title/时,就会调用该函数,并生成对应的excel文件,用户可以直接下载。
阅读全文