在Django Rest Framework框架中,现在有一个Exam模型里面有student字段和title字段,还有一个TestPaper模型里面有student字段与存放成绩的score字段,现在需要在views.py中写入一个功能,用来将指定exam(通过title进行筛选)中的学生的成绩导出成excel,第一行为考试title,第二行为考生姓名,第三行为考生成绩,使用pandas 来做
时间: 2024-03-19 07:45:02 浏览: 50
好的,我会为您解答这个问题。
首先,我们需要在 `views.py` 中定义一个视图函数,用来处理导出成绩的请求。可以参考以下代码:
```python
from django.http import HttpResponse
from django.shortcuts import get_object_or_404
from rest_framework.decorators import api_view
import pandas as pd
from exam.models import Exam
from testpaper.models import TestPaper
@api_view(['GET'])
def export_scores(request, title):
exam = get_object_or_404(Exam, title=title)
testpapers = TestPaper.objects.filter(student__in=exam.student.all())
# 构造数据
data = {
'title': [title],
'name': [tp.student.name for tp in testpapers],
'score': [tp.score for tp in testpapers]
}
# 转换为 DataFrame
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` 参数,用来指定要导出成绩的考试名称。首先,我们通过 `title` 参数从数据库中获取到对应的 `Exam` 对象。然后,我们从 `TestPaper` 模型中获取到所有参加该考试的学生的成绩。接着,我们使用 `pandas` 构造一个字典,包含考试标题、学生姓名和成绩。最后,我们将这个字典转换为 `DataFrame`,并使用 `to_excel` 方法将数据写入到 Excel 文件中。最后,我们将生成的 Excel 文件作为响应发送给客户端。
需要注意的是,这个视图函数需要使用 `@api_view` 装饰器进行修饰,以便支持 RESTful API。此外,还需要从 `exam.models` 和 `testpaper.models` 中导入 `Exam` 和 `TestPaper` 模型。
阅读全文