我注意到,在文件上传中使用序列化程序时,我不再需要使用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,文件PUT
和photo
可以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中错过了什么 - 为什么上传的文件永远不会触及我的自定义存储空间?
答案 0 :(得分:3)
Django REST Framework 3弃用了request.DATA
和request.FILES
属性in favor of a unified request.data
property。序列化程序也已更新,以删除files
参数,仍保留data
参数,该参数应为request.data
而不是request.DATA
。
在您的示例中,您似乎正在更改传入的数据,因为您将其设置为变量postData
,但不包括在内。最有可能的是,您没有使用request.data
,问题是您只获取没有文件的数据,而不是您期望的完整数据。
您应该可以通过记录request.data
和postData
的值来验证这一点,并检查request.data
是否包含您要发送的图片。