DRF: как вызвать метод post после успешной реализации метода put - PullRequest
0 голосов
/ 17 марта 2020

У меня есть два отдельных метода:

  1. для загрузки и проверки файла CSV FileUploadView (APIView) [PUT]
  2. для добавления новых объектов в базу данных на основе их загруженного файла data CsvToDatabase [POST]

Для этой цели используются 2 разных URL-адреса

Теперь я хочу объединить эту функциональность в один, чтобы файл загружался с обработкой и созданием экземпляров в базе данных делается по одному запросу. То есть конечная цель - пользователь приложения отправляет файл на сервер, после чего все происходит автоматически.

загрузка файла

class FileUploadView(APIView):
    parser_classes = (MultiPartParser, FormParser)
    permission_classes = (permissions.AllowAny,)

    def put(self, request, format=None):
        if 'file' not in request.data:
            raise ParseError("Empty content")
        f = request.data['file']
        filename = f.name
        if filename.endswith('.csv'):
            file = default_storage.save(filename, f)
            r = csv_file_parser(file)
            status = 204
            print(json.dumps(r))
        else:
            status = 406
            r = "File format error"
        return Response(r, status=status)

создание экземпляров

class CsvToDatabase(APIView):


    permission_classes = (permissions.AllowAny,)
    serializer_class = VendorsCsvSerializer

    def post(self, request, format=None):
        r_data = request.data
        ...
        #some logic
        ...
            serializer = VendorsCsvSerializer(data=data)
            try:
                serializer.is_valid(raise_exception=True)
                serializer.save()
            except ValidationError:
                return Response({"errors": (serializer.errors,)},
                                status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(request.data, status=status.HTTP_200_OK)

как правильно объединить два метода в одной конечной точке, чтобы в случае успешной проверки файла CSV вызывался метод POST? Или, может быть, лучше оставить два разных URL-адреса и отправить json, полученный после анализа файла .csv, на URL-адрес методом POST? Этот вариант мне кажется проще проверить. но как мне это сделать? Спасибо!

1 Ответ

0 голосов
/ 17 марта 2020

Я решил это так

class FileUploadView(APIView):
    parser_classes = (MultiPartParser, FormParser)
    # renderer_classes = [JSONRenderer]
    permission_classes = (permissions.AllowAny,)
    serializer_class = VendorsCsvSerializer

    def put(self, request, format=None):
        if 'file' not in request.data:
            raise ParseError("Empty content")
        f = request.data['file']
        filename = f.name
        if filename.endswith('.csv'):
            file = default_storage.save(filename, f)
            r = csv_file_parser(file)
            status = 204
            response = Response(r)
            self.post(request=response)
        else:
            status = 406
            r = "File format error"
        return Response(r, status=status)

    def post(self, request, format=None):
        r_data = request.data
        ....
            serializer = VendorsCsvSerializer(data=data)
            try:
                serializer.is_valid(raise_exception=True)
                serializer.save()
            except ValidationError:
                return Response({"errors": (serializer.errors,)},
                                status=status.HTTP_400_BAD_REQUEST)
        else:
            return Response(request.data, status=status.HTTP_200_OK)

Я надеюсь, что это правильный путь

...