@Lepilov

Ошибка сериализации json даных?

Класс FileUploadView принимает .csv файл и возвращает спаршенные данные в виде JSON (если я правильно понимаю смысл использования renderer_classes = [JSONRenderer] )

class FileUploadView(APIView):
    parser_classes = ( MultiPartParser, FormParser)
    renderer_classes = [JSONRenderer]

    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
        else:
            status = 406
            r = "File format error"
        return Response(r, status=status)


Функция csv_file_parser() которая вызывается в классе валидирует csv файл и формирует словарь. В итоге результат возвращаемый классом FileUploadView

{
    "1": {
        "vendor_name": "Firstvendortestname",
        "country": "BE",
        "NDA date": "2019-12-24",
        "Primary Contact Name": "Jack Jhonson",
        "Primary Contact Email": "jack@gmail.com",
        "Secondary Contact Name": "Jack2 Jhonson",
        "Secondary Contact Email": "jack2@gmail.com",
        "Modules": "Module1, Module2"
    },
    "2": {
        "vendor_name": "Firstvendortestname",
        "country": "BE",
        "NDA date": "",
        "Primary Contact Name": "Sandra Bullock",
        "Primary Contact Email": "sandra@gmail.com",
        "Secondary Contact Name": "Sandra Bullock",
        "Secondary Contact Email": "sandra@gmail.com",
        "Modules": "Module1, Module2"
    }
}


Далее этот JSON передается на вход класса CsvToDatabase

class CsvToDatabase(APIView):

    def post(self, request, format=None):
        serializer = VendorsSerializer(data=request.data)
        print(request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)


И при вызове этого кода получаю ошибку

{
    "vendor_name": [
        "This field is required."
    ],
    "country": [
        "This field is required."
    ]
}


Если я меняю формат входяего JSON на
{
"vendor_name": "Firstvendortestname",
"country": "BE",
"NDA date": "2019-12-24",
"Primary Contact Name": "Jack Jhonson",
"Primary Contact Email": "jack@gmail.com",
"Secondary Contact Name": "Jack2 Jhonson",
"Secondary Contact Email": "jack2@gmail.com",
"Modules": "Module1, Module2"
}

То все ок. Подскажите что изменить что бы мои данные валидировались?
  • Вопрос задан
  • 194 просмотра
Решения вопроса 1
@Realmixer
Full stack Python (Django) web-developer
Сериализатор VendorsSerializer в классе CsvToDatabase заточен на приём данных для одного объекта, а вы передаёте в него список объектов. Варианта два: или передавать с фронта на бэк каждый объект отдельным запросом, или делать CsvToDatabase способным обработать список объектов.

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

Во втором варианте можно сначала проверить все объекты, и лишь в случае успеха сохранить их в БД. Начало может быть примерно таким:
class CsvToDatabase(APIView):
    def post(self, request, format=None):
        for key, data_item in request.data.items():
            serializer = VendorsSerializer(data=data_item)
            ...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы