У меня есть это действие:
@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
и export_to_csv
is:
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)
И show_stages_tasks
возвращает сериализованные данные с сериализатором DRF с 3-мя вложенными сериализаторами (тожебольшой, и я думаю, что нет необходимости размещать его здесь).
Как вы видите здесь - я анализирую данные сериализатора, создаю файл CSV, сохраняю его, затем открываю его, передаю ответ и удаляю файл.Вопрос Можно ли как-то передать содержимое файла, не создавая файл CSV и не удаляя его?