人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

Python django導出excel詳解

發(fā)布日期:2021-12-16 10:02 | 文章來源:gibhub

django restframework 導入excel內(nèi)容,可以查看另外一篇文章

一、基礎環(huán)境

web架構(gòu):前后端分離,前端使用vue,后端使用django 的rest framework

django版本3.2

django-excel 版本0.0.10

djangorestframework版本3.12.4

二、需求

界面導出excel數(shù)據(jù)內(nèi)容

導入model包含外鍵類型

三、功能實現(xiàn)

1.不使用序列化類:需要手動實現(xiàn)外鍵對象轉(zhuǎn)換為外鍵值

2.使用序化類:

四、源碼

#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資產(chǎn)類型"
class MyAsset(models.Model):
 ittype = models.ForeignKey(MyITtype, on_delete=models.SET_NULL, verbose_name="產(chǎn)品類型", null=True)
 code = models.CharField(verbose_name="資產(chǎn)編碼", 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="規(guī)格說明", 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)"

一、序化類實現(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()
# 如果有值,表示導出部分,否則導出全部
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": "導出數(shù)據(jù)出錯"
}
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: 類名
 :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

二、手動轉(zhuǎn)換外鍵實現(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": "導出數(shù)據(jù)出錯"
}
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: 類名
 :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),即獲取該對象某個字段內(nèi)容
if isinstance(value, Model):
 value = eval("".join(["obj." + name + "_id"]))  # 等價于obj.name_id,即獲取該對象中外鍵對象數(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é)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注本站的更多內(nèi)容!

版權(quán)聲明:本站文章來源標注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學習參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。

相關文章

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部