Лучший способ подать ответ с DRF? - PullRequest
0 голосов
/ 23 октября 2018

У меня есть это действие:

@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 и не удаляя его?

1 Ответ

0 голосов
/ 23 октября 2018

В официальном документе Django вы можете найти похожий пример.

В этом примере они используют класс django.http.HttpResponse, это также может бытьиспользуется в вашем случае

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...