【问题标题】:How to use MultiPartParser in Django Rest Framework如何在 Django Rest 框架中使用 MultiPartParser
【发布时间】:2023-06-21 02:25:02
【问题描述】:

我需要上传一个文件和一些与之关联的 JSON。但我不明白如何保存不同的部分,特别是 JSON 部分,即我能够保存图像但不能保存 JSON。

read that I need to use a 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 格式?也许我需要更改序列化程序?

【问题讨论】:

    标签: django django-rest-framework geodjango django-rest-framework-gis


    【解决方案1】:

    至于整合MultiPartParser,是用View完成的,因为它负责接收请求并处理它,而不是Serializer。 您正在使用基于类的视图并使用 parser_classes 属性完成解析器的定义,如您提供的官方文档的同一链接中所述。

    所以你的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)
    

    关于SerializerPointField,请查看this SO answer

    【讨论】:

    • 你好@Anas,在调用包含图片的post api时真的有必要使用parser_class吗??如果是,我们必须使用Formdataparser的MultiPart哪一个??
    • 你好@Anas *.com/questions/67622998/…你能帮我吗??