如何在 Django Rest Framework 中使用 MultiPartParser
How to use MultiPartParser in Django Rest Framework
我需要上传一个文件和一些与之关联的 JSON。但我不明白如何保存不同的部分,特别是 JSON 部分,即我可以保存图像但不能保存 JSON.
我 read that I need to use a MultiPartParser 但我不知道如何将它正确地集成到我的序列化程序中 class。
这是我的服务器正在接收的多部分请求:
<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 格式?也许我需要更改序列化程序?
至于集成 MultiPartParser
,它是通过 View
完成的,因为它负责接收和处理请求,而不是 Serializer
。
您使用的是基于 class 的视图,并且使用 parser_classes
属性定义解析器,如您提供的官方文档 link 中所述。
所以你的 View
变成:
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
的 Serializer
,检查 this SO answer
我需要上传一个文件和一些与之关联的 JSON。但我不明白如何保存不同的部分,特别是 JSON 部分,即我可以保存图像但不能保存 JSON.
我 read that I need to use a MultiPartParser 但我不知道如何将它正确地集成到我的序列化程序中 class。
这是我的服务器正在接收的多部分请求:
<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 格式?也许我需要更改序列化程序?
至于集成 MultiPartParser
,它是通过 View
完成的,因为它负责接收和处理请求,而不是 Serializer
。
您使用的是基于 class 的视图,并且使用 parser_classes
属性定义解析器,如您提供的官方文档 link 中所述。
所以你的 View
变成:
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
的 Serializer
,检查 this SO answer