Django DRF使用django-filter过滤后如何导出XLS格式文件
实现过滤后数据导出XLS的步骤
1. 安装依赖
首先安装用于生成xls文件的工具库:pip install xlwt
2. 修改现有视图逻辑
你现有的ProductsReport视图已经集成了django-filter的过滤能力,只需重写list方法,增加导出判断逻辑即可,修改后的完整代码如下:
import xlwt from django.http import HttpResponse from rest_framework.response import Response from rest_framework import generics class ProductsReport(generics.ListAPIView): permission_classes = GLOBAL_PERMISSIONS serializer_class = serializers.ProductReportSerializer queryset = models.SchichtNomenclature.objects.all() filter_backends = DEFAULT_FILTERS filter_class = ProductsReportFilter ordering = ["-schicht__updated"] def list(self, request, *args, **kwargs): # 先获取经过django-filter过滤后的数据集 queryset = self.filter_queryset(self.get_queryset()) # 检测请求参数是否触发导出操作,参数名可自定义 if request.query_params.get('export') == 'xls': # 初始化xls工作簿和工作表 work_book = xlwt.Workbook(encoding='utf-8') work_sheet = work_book.add_sheet('产品报表') # 自定义表头,替换为你实际需要导出的字段名称 headers = ['ID', '产品名称', '更新时间', '其他字段'] for col_index, header in enumerate(headers): work_sheet.write(0, col_index, header) # 逐行写入过滤后的数据集 for row_index, instance in enumerate(queryset, start=1): # 按照你的模型字段替换对应的取值逻辑 work_sheet.write(row_index, 0, instance.id) work_sheet.write(row_index, 1, instance.name) work_sheet.write(row_index, 2, instance.schicht.updated.strftime('%Y-%m-%d %H:%M:%S')) # 其他字段依次类推 # 构造文件下载响应 response = HttpResponse(content_type='application/ms-excel') response['Content-Disposition'] = 'attachment; filename="products_report.xls"' work_book.save(response) return response # 非导出请求走原有接口逻辑返回JSON数据 serializer = self.get_serializer(queryset, many=True) return Response(serializer.data)
3. 调用导出
调用导出时直接在原有过滤参数后追加导出标识参数即可,示例请求路径:/你的接口路径?过滤参数1=值1&过滤参数2=值2&export=xls
注意事项
- 代码里的表头和字段取值需要和你的
SchichtNomenclature模型实际字段对应,不要直接复制示例内容 - 若导出数据量较大,建议做异步处理或者分页导出,避免接口超时
如果你不想手动写xls写入逻辑,也可以使用django-import-export库,配置对应模型的Resource类后可直接调用导出方法生成文件,省去逐行写数据的步骤。
内容的提问来源于stack exchange,提问作者Slad
相关产品推荐
相关产品推荐

