django restframework 导入excel内容,可以查看另外一篇文章
一、基础环境
web架构:前后端分离,前端使用vue,后端使用django 的rest framework
django版本3.2
django-excel 版本0.0.10
djangorestframework版本3.12.4
二、需求
界面导出excel数据内容
导入model包含外键类型
三、功能实现
1.不使用序列化类:需要手动实现外键对象转换为外键值
2.使用序化类:
四、源码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
#models.py from django.db import models from django.utils import timezone class MyITtype(models.Model): name = models.CharField(verbose_name = "名称" , max_length = 128 , unique = True ) ittype = models.SmallIntegerField(verbose_name = "类型" ) comment = models.TextField(verbose_name = "备注" , blank = True , default = "") def __str__( self ): return self .name class Meta: db_table = "MyITtype" verbose_name = "it资产类型" class MyAsset(models.Model): ittype = models.ForeignKey(MyITtype, on_delete = models.SET_NULL, verbose_name = "产品类型" , null = True ) code = models.CharField(verbose_name = "资产编码" , max_length = 128 , unique = True ) buytime = models.DateField(verbose_name = "入仓时间" , default = timezone.now) usetime = models.DateField(verbose_name = "分配时间" , default = timezone.now) comment = models.TextField(verbose_name = "规格说明" , blank = True , default = "") user = models.CharField(verbose_name = "使用人" , max_length = 128 , blank = True , default = "") status = models.IntegerField(verbose_name = "状态" ) def __str__( self ): return self .code class Meta: db_table = "opGTITAsset" verbose_name = "it固产" |
一、序化类实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
#asset-export.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.serializers import ModelSerializer from .models import MyAsset import django_excel as excel class ITAssetSer(ModelSerializer): class Meta: model = MyAsset fields = '__all__' class ITAssetExport(APIView): """""" use_model = MyAsset queryset = use_model.objects. all () serializer_class = ITAssetSer def post( self , request, * args, * * kwargs): try : data = request.data id_list = data.get( "data" ) obj_list = self .queryset. all () # 如果有值,表示导出部分,否则导出全部 if id_list: obj_list = obj_list. filter (id__in = id_list) ser = self .serializer_class(instance = obj_list, many = True ) return MakeExcel(obj_list = ser.data, class_name = self .use_model, filename = "itasset" ) except : ret = { "code" : 599 , "message" : "导出数据出错" } return Response(ret) def get( self , request, * args, * * kwargs): self .http_method_not_allowed(request, * args, * * kwargs) def MakeExcel(obj_list, class_name, filename): """ 制作excel表 :param ser_list: 内容列表 :param class_name: 类名 :param filename: 文件名 :return: """ meta_fields = class_name._meta.fields name_list = [field.name for field in meta_fields] header_list = [field.verbose_name for field in meta_fields] wdata = [header_list] for obj in obj_list: data = [obj[name] for name in name_list] wdata.append(data) sheet = excel.pe.Sheet(wdata) response = excel.make_response(pyexcel_instance = sheet, file_name = filename, file_type = "xlsx" ) return response |
二、手动转换外键实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#asset-export.py from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.objializers import ModelSerializer from .models import MyAsset import django_excel as excel class ITAssetSer(ModelSerializer): class Meta: model = MyAsset fields = '__all__' class ITAssetExport(APIView): """""" use_model = MyAsset queryset = use_model.objects. all () objializer_class = ITAssetSer def post( self , request, * args, * * kwargs): try : obj_list = self .use_model.objects. all () return MakeExcel(obj_list = obj_list, class_name = self .use_model, filename = "itasset" ) except : ret = { "code" : 599 , "message" : "导出数据出错" } return Response(ret) def get( self , request, * args, * * kwargs): self .http_method_not_allowed(request, * args, * * kwargs) def MakeExcel(obj_list, class_name, filename): """ 制作excel表 :param obj_list: 内容列表 :param class_name: 类名 :param filename: 文件名 :return: """ meta_fields = class_name._meta.fields name_list = [field.name for field in meta_fields] header_list = [field.verbose_name for field in meta_fields] wdata = [header_list] for obj in obj_list: data = [] for name in name_list: value = eval ( "obj." + name) # 等价于getattr(obj,name),即获取该对象某个字段内容 if isinstance (value, Model): value = eval (" ".join([" obj. " + name + " _id"])) # 等价于obj.name_id,即获取该对象中外键对象数值 data.append(value) # 参考例子 # data = [getattr(obj, name) if name != "ittype" else obj.ittype_id for name in name_list] wdata.append(data) sheet = excel.pe.Sheet(wdata) response = excel.make_response(pyexcel_instance = sheet, file_name = filename, file_type = "xlsx" ) return response |
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/u014113686/article/details/121035842