如何在Django REST Framework中返回含JSON的文本文件?
嘿,这个问题其实挺常见的,你思路方向完全对——确实要通过重写方法+设置响应头来实现,我给你一步步拆解怎么操作:
解决方法:让DRF返回包含JSON的文本文件响应
你不需要完全推翻ListAPIView已有的逻辑,它已经帮你处理了查询集过滤、序列化的核心工作,我们只需要在它的基础上修改最终的响应即可。
具体实现步骤
1. 重写get方法,获取并处理序列化数据
先调用父类的逻辑拿到序列化后的数据集,再把数据转换成格式化的JSON字符串(可选,让文件内容更易读)。
2. 设置关键响应头
通过Content-Disposition头告诉浏览器这是一个需要下载的附件,同时指定文件名;再用Content-Type明确这是纯文本格式。
完整代码示例
from django.http import HttpResponse from rest_framework import generics import json class MyModelJSONView(generics.ListAPIView): serializer_class = MySerializer queryset = MyModel.objects.all() def get(self, request, *args, **kwargs): # 复用ListAPIView的逻辑获取序列化后的数据 queryset = self.filter_queryset(self.get_queryset()) serializer = self.get_serializer(queryset, many=True) json_data = serializer.data # 把JSON数据转成带缩进的格式化字符串(可选,提升可读性) json_str = json.dumps(json_data, indent=4) # 创建文本类型的响应 response = HttpResponse(json_str, content_type='text/plain') # 设置下载触发头,自定义文件名 response['Content-Disposition'] = 'attachment; filename="mymodel_data.json.txt"' return response
关键点说明
json.dumps(..., indent=4):这一步是可选的,不加indent参数的话,JSON会是压缩后的单行格式,加了之后会换行缩进,方便用户打开文件后阅读。content_type='text/plain':确保浏览器识别这是纯文本文件,而不是尝试当成网页解析。Content-Disposition里的filename可以自由命名,比如你想直接叫data.json也可以,浏览器会按JSON文件下载;如果要严格是文本文件格式,用.txt或者.json.txt后缀都没问题。
另外,如果你不想重写get方法,也可以重写finalize_response方法来修改响应头,但重写get的方式更直观,适合你的场景。
内容的提问来源于stack exchange,提问作者David Pekker
相关产品推荐
相关产品推荐

