Python 使用DRF提交响应的更好方法?
我有以下行动:Python 使用DRF提交响应的更好方法?,python,django,django-rest-framework,Python,Django,Django Rest Framework,我有以下行动: @action(methods=['get'], detail=True) def download_csv(self, request, pk, *args, **kwargs): project = self.get_object() data = show_stages_tasks(request, pk) file_name = f"{project.name}.csv" export_to_csv(
@action(methods=['get'], detail=True)
def download_csv(self, request, pk, *args, **kwargs):
project = self.get_object()
data = show_stages_tasks(request, pk)
file_name = f"{project.name}.csv"
export_to_csv(data, file_name)
file_handle = open(file_name, "r")
response = FileResponse(file_handle.read(), content_type='application/csv')
response['Content-Disposition'] = f'attachment; filename="{file_handle.name}"'
file_handle.close()
os.remove(file_name)
return response
并将_导出到_csv是:
show_stages_tasks返回一个带有DRF序列化程序的序列化数据,其中3个嵌套序列化程序太大,我认为没有必要在这里发布。
正如您在这里看到的-我解析序列化程序数据,创建一个CSV文件,保存它,然后打开它,传入响应并删除文件。问题是,我是否可以通过某种方式传递文件的内容,而不实际创建CSV文件并将其删除?从中,您可以找到类似的示例。
在那个示例中,他们使用的是django.http.HttpResponse类,它也可以用于您的案例中
我建议使用
def export_to_csv(data, filename="project"):
content = JSONRenderer().render(data)
stream = io.BytesIO(content)
content_parsed = JSONParser().parse(stream)
tasks = content_parsed[0]["related_tasks"]
keys = tasks[0].keys()
with open(filename, 'w') as output_file:
dict_writer = csv.DictWriter(output_file, fieldnames=keys)
dict_writer.writeheader()
for task in tasks:
task['children'] = []
task['task_folders'] = []
dict_writer.writerow(task)
import csv
from django.http import HttpResponse
def some_view(request):
# Create the HttpResponse object with the appropriate CSV header.
response = HttpResponse(content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="somefilename.csv"'
writer = csv.writer(response)
writer.writerow(['First row', 'Foo', 'Bar', 'Baz'])
writer.writerow(['Second row', 'A', 'B', 'C', '"Testing"', "Here's a quote"])
return response