Python django导出excel详解
作者:时光茶居 发布时间:2021-06-15 17:12:19
标签:Python,django,导出,excel
django restframework 导入excel内容,可以查看另外一篇文章
一、基础环境
web架构:前后端分离,前端使用vue,后端使用django 的rest framework
django版本3.2
django-excel 版本0.0.10
djangorestframework版本3.12.4
二、需求
界面导出excel数据内容
导入model包含外键类型
三、功能实现
1.不使用序列化类:需要手动实现外键对象转换为外键值
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资产类型"
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固产"
一、序化类实现
#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
二、手动转换外键实现
#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


猜你喜欢
- 对于一些数据量较大的系统,数据库面临的问题除了查询效率低下,还有就是数据入库时间长。特别像报表系统,每天花费在数据导入上的时间可能会长达几个
- 快排是python经典算法之一。1、下面讲解的是什么是快排和快排的图示。2、快排是一种解决排序问题的运算方法。3、快排的原理:在数组中任意选
- 1.外形尺寸尺寸单位:只用默认的像素或者其他字符类的值!,不要用英寸毫米之类的内容。btn = tkinter.Button(root,te
- 前序There should be one - and preferably only one - obvious way to do it
- 什么是跨域跨域是浏览器的专用概念,指js代码访问自己来源站点之外的站点。比如A站点网页中的js代码,请求了B站点的数据,就是跨域。A和B要想
- 下面就先定义一个函数: def foo(): print('function') foo() 在上述代码中,定义了一个名为f
- 对于Linux用户来说,命令行的名声相当的高。不像其他操作系统,命令行是一个可怕的命题,但是对于Linux社区中那些经验丰富的大牛,命令行却
- 【基本介绍】【格式】:pivot(聚合函数 for 需要转为列的字段名 in(需要转为列的字段值))【说明】:实现将指定字段的字段值转换为列
- 我需要使用tesseract-OCR的模块,vs的配置有点麻烦,所以采用py的环境,搭建。1.在python.org网站下载python3.
- 1.样式的重用性CSS布局的网页最大的特点就是样式的可重用性,利用class选择符重复将某个样式属性多次在网页中使用,以减少不断定义样式属性
- from keras.utils.np_utils import to_categorical注意:当使用categorical_cross
- 本文实例讲述了php与javascript正则匹配中文的方法。分享给大家供大家参考,具体如下:php中正则匹配utf-8中文: (重点是:[
- 背景:这个库的安装不是像其他的一样的直接使用 pip install XXX的形式,而是使用原始的Git方式1、apex这是NVIDIA开发
- 一:导入pmo.xm配置包mysql库连接、druid连接池、mybatis组件<!-- 使用MySQL数据库--> <d
- 导入相关包import timeimport pydashimport base64import requestsfrom lxml imp
- 最近在重新看vue3的rfcs,发现一个细节,原话如下:props that start with on are handled as v-
- 什么是设计模式设计模式是针对软件开发中出现的常见问题的可重用解决方案。它们并不特定于任何编程语言或框架,而是描述了可应用于各种情况的一般原则
- 本文实例讲述了Python操作MongoDB数据库的方法。分享给大家供大家参考,具体如下:>>> import pymon
- Prometheus 为开发这提供了客户端工具,用于为自己的中间件开发Exporter,对接Prometheus 。目前支持的客户端GoJa
- 写在前面最近每日一更,我这菜鸡都有点儿不好意思了简单介绍简单用法是:assert expression让我们用程序来测试这个expressi