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