Python django導(dǎo)出excel詳解
django restframework 導(dǎo)入excel內(nèi)容,可以查看另外一篇文章
一、基礎(chǔ)環(huán)境
web架構(gòu):前后端分離,前端使用vue,后端使用django 的rest framework
django版本3.2
django-excel 版本0.0.10
djangorestframework版本3.12.4
二、需求
界面導(dǎo)出excel數(shù)據(jù)內(nèi)容
導(dǎo)入model包含外鍵類(lèi)型
三、功能實(shí)現(xiàn)
1.不使用序列化類(lèi):需要手動(dòng)實(shí)現(xiàn)外鍵對(duì)象轉(zhuǎn)換為外鍵值
2.使用序化類(lèi):
四、源碼
#models.py from django.db import models from django.utils import timezone class MyITtype(models.Model): name = models.CharField(verbose_name="名稱(chēng)", max_length=128, unique=True) ittype = models.SmallIntegerField(verbose_name="類(lèi)型") comment = models.TextField(verbose_name="備注", blank=True, default="") def __str__(self): return self.name class Meta: db_table = "MyITtype" verbose_name = "it資產(chǎn)類(lèi)型" class MyAsset(models.Model): ittype = models.ForeignKey(MyITtype, on_delete=models.SET_NULL, verbose_name="產(chǎn)品類(lèi)型", null=True) code = models.CharField(verbose_name="資產(chǎn)編碼", max_length=128, unique=True) buytime = models.DateField(verbose_name="入倉(cāng)時(shí)間", default=timezone.now) usetime = models.DateField(verbose_name="分配時(shí)間", default=timezone.now) comment = models.TextField(verbose_name="規(guī)格說(shuō)明", blank=True, default="") user = models.CharField(verbose_name="使用人", max_length=128, blank=True, default="") status = models.IntegerField(verbose_name="狀態(tài)") def __str__(self): return self.code class Meta: db_table = "opGTITAsset" verbose_name = "it固產(chǎn)"
一、序化類(lèi)實(shí)現(xiàn)
#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() # 如果有值,表示導(dǎo)出部分,否則導(dǎo)出全部 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": "導(dǎo)出數(shù)據(jù)出錯(cuò)" } 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: 內(nèi)容列表 :param class_name: 類(lèi)名 :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
二、手動(dòng)轉(zhuǎn)換外鍵實(shí)現(xiàn)
#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": "導(dǎo)出數(shù)據(jù)出錯(cuò)" } 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: 內(nèi)容列表 :param class_name: 類(lèi)名 :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) # 等價(jià)于getattr(obj,name),即獲取該對(duì)象某個(gè)字段內(nèi)容 if isinstance(value, Model): value = eval("".join(["obj." + name + "_id"])) # 等價(jià)于obj.name_id,即獲取該對(duì)象中外鍵對(duì)象數(shù)值 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
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
Python實(shí)現(xiàn)插入排序和選擇排序的方法
這篇文章主要介紹了Python實(shí)現(xiàn)插入排序和選擇排序的方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05python下載文件記錄黑名單的實(shí)現(xiàn)代碼
這篇文章主要介紹了python下載文件記錄黑名單的實(shí)現(xiàn)代碼,需要的朋友可以參考下2017-10-10賺瘋了!轉(zhuǎn)手立賺800+?大佬的python「搶茅臺(tái)腳本」使用教程
這篇文章主要介紹了如果利用python搶購(gòu)京東茅臺(tái),幫助大家更好的理解和使用python,感興趣的朋友可以了解下2021-01-01python為什么會(huì)環(huán)境變量設(shè)置不成功
在本篇文章里小編給大家分享的是一篇關(guān)于python環(huán)境變量設(shè)置不成功怎么辦的解決方法內(nèi)容,有興趣的朋友們可以跟著學(xué)習(xí)下。2020-06-06Python Numpy教程之排序,搜索和計(jì)數(shù)詳解
這篇文章主要為大家詳細(xì)介紹了Python?NumPy中排序,搜索和計(jì)數(shù)的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Python有一定幫助,需要的可以參考一下2022-08-08