1、模型类

#用户表
class User(AbstractUser):
    #继承原来的auth表,拓展字段,不要与原来有的字段名重复
    telephone = models.CharField(max_length=11,verbose_name='手机号码')
    name = models.CharField(max_length=12,verbose_name='用户姓名')
    sid = models.CharField(max_length=24,verbose_name='身份证')
    sex = models.IntegerField(choices=((1,'男'),(0,'女')),default=1,verbose_name='性别')
    role = models.IntegerField(choices=((1,'超级管理员'),(2,'管理员'),(3,'老师'),(4,'学生')),default=4,verbose_name='用户角色')
    stuclass = models.ForeignKey(to='stuClass',null=True,on_delete=models.CASCADE,verbose_name='班级外键')
    def __str__(self):
        return self.username
    #返回班级的班号
    @property
    def class_name(self):
        return self.stuclass.classon
    #返回性别的中文
    @property
    def sex_name(self):
        return self.get_sex_display()

2、序列化类

from  rest_framework import serializers
from rest_framework.exceptions import ValidationError
from . import models

class StudentsExcelServializer(serializers.ModelSerializer):
    class Meta:
        model = models.User
        fields =['name','username','telephone','email','sid','class_name','sex_name']

3、视图类

class ExportExcelTableView(ViewSet):
    authentication_classes = []
    @action(methods=['get'],detail=False)
    def outtudents(self,request,*args,**kwargs):
          #拿出所有的信息
        users = models.User.objects.filter(role=4)
        #对学生信息进行序列化
        ser = serializer.StudentsExcelServializer(instance=users,many=True)
        #新建一个工作簿
        wb = Workbook()
        #新建一个工作表
        ws = wb.create_sheet('students',0)
        #表的首行
        ws.append(['姓名','学号','手机号码','邮箱','身份证','班级','性别'])
        for dic in ser.data:
            #将数据库查询到的数据写到excel表格中
            ws.append(
                [dic.get('name'),dic.get('username'),
                 dic.get('telephone'),dic.get('email'),
                 dic.get('sid'),dic.get('class_name'),
                 dic.get('sex_name')]
            )
        #文件名
        name = f'{stu_class.classon}.xlsx'
        # 这个是media文件夹下的students_excels文件夹路径,保存学生消息的excel表
        PATH = os.path.join(settings.MEDIA_ROOT,'students_excels',name)
        wb.save(PATH)
        #ApiResponse是自己封装的
        return ApiResponse(msg='生成班级文件成功',data={'文件名':name})

4、路由层:urls.py

from rest_framework import routers
from . import views
rou = routers.SimpleRouter()
#生成excel表格的视图函数
rou.register('',views.ExportExcelTableView,'create_excel')
urlpatterns = [

]
urlpatterns+=rou.urls

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐