Как использовать 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
проверьте этот так ответ