You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 22:36:03