Django Rest Framework 3:无需request.FILES上传文件

时间:2014-12-14 15:04:32

标签: python django django-rest-framework

我注意到,在文件上传中使用序列化程序时,我不再需要使用Django Rest Framework 3来指定files=request.FILES。根据{{​​3}},request.data现在包含所有数据。所以,我只是删除files=request.FILES,然后从:

serializer = MediaSerializer(
    theMedia,
    data = postData,
    files = request.FILES,
    partial = True
)

到:

serializer = MediaSerializer(
    theMedia,
    data = postData,
    partial = True
)

在我的Django API应用程序中,我有一个/ media / endpoint,文件PUTphoto可以filename。{使用我所做的更改尝试PUT文件时,文件永远不会触及我的自定义存储。标题是正确的(Content-Type:multipart / form-data),它在DRF 2.x中都运行良好。

我注意到我需要在我的视图中使用MultiPartParser才能使用fileField,所以现在我的视图使用了parser_classes = (JSONParser, MultiPartParser)

以下是序列化程序处理文件的部分:

class MediaSerializer(serializers.ModelSerializer):
    photo = serializers.ImageField(
        max_length = None,
        required = False,
        allow_empty_file = False)
    filename = serializers.FileField(
        max_length = None,
        required = False,
        allow_empty_file = False)
    ...

class Meta:
    model = Media
    fields = (
        'photo',
        'filename'
    )

也许我还应该提一下我在设置中关闭了UPLOADED_FILES_USE_URL

我的问题是:我在DRF3中错过了什么 - 为什么上传的文件永远不会触及我的自定义存储空间?

1 个答案:

答案 0 :(得分:3)

Django REST Framework 3弃用了request.DATArequest.FILES属性in favor of a unified request.data property。序列化程序也已更新,以删除files参数,仍保留data参数,该参数应为request.data而不是request.DATA

在您的示例中,您似乎正在更改传入的数据,因为您将其设置为变量postData,但不包括在内。最有可能的是,您没有使用request.data,问题是您只获取没有文件的数据,而不是您期望的完整数据。

您应该可以通过记录request.datapostData的值来验证这一点,并检查request.data是否包含您要发送的图片。