Как использовать MultiPartParser в Django Rest Framework

Мне нужно загрузить файл и некоторые JSON, связанные с ним. Но я не понимаю, как сохранить различные части, в частности, часть JSON, т.е. я могу сохранить изображение, но не JSON.

Я прочитал, что мне нужно использовать MultiPartParser, но я не могу понять, как правильно интегрировать его в мой класс сериализатора.

Вот запрос из нескольких частей, который получает мой Сервер:

<QueryDict: {'geo': ['{"point" : { "type:" : "Point", "coordinates" : [11.51350462236356, -22.70903491973877]}}'], 'picture': [<TemporaryUploadedFile: photo3.jpg (image/*)>]}>

Вот мнение:

class UserUploadedPicture(APIView):

    def post(self, request, format=None):
        print(request.data)
        print("\n\n\n")
        serializer = PictureSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

Вот сериализатор:

class PictureSerializer(GeoFeatureModelSerializer):
    class Meta:
        model = Pictures
        geo_field = "point"
        fields = ('picture', 'processed', 'flagged', 'point')

Вот модель:

class Pictures(models.Model):
    objects = models.GeoManager()
    picture = models.ImageField(null=True, default=None, blank=True)
    processed = models.BooleanField(default=False)
    flagged = models.BooleanField(default=False)
    point = models.PointField(null=True, default=None, blank=True)

Может кто-нибудь, пожалуйста, скажите мне, как сериализовать point поле правильно? Может быть, мне нужно изменить формат JSON? Может мне нужно поменять сериализатор?

1 ответ

Решение

Что касается интеграции MultiPartParser, то это делается с помощью представления, поскольку оно отвечает за получение запроса и его обработку, а не за сериализатор. Вы используете представление на основе классов, и определение парсера выполняется с помощью parser_classes атрибут, как описано в той же ссылке на официальную документацию, которую вы предоставили.

Таким образом, ваш взгляд становится:

class UserUploadedPicture(APIView):
    parser_classes = (MultiPartParser, )

    def post(self, request, format=None):
        print(request.data)
        print("\n\n\n")
        serializer = PictureSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return JsonResponse(serializer.data)
        return JsonResponse(serializer.errors, status=400)

А по поводу вашего сериализатора для PointFieldпроверьте этот так ответ

Другие вопросы по тегам