我注意到使用 Django Rest Framework 3 在文件上传中使用序列化程序时不再需要指定 files=request.FILES。根据release notes , 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/端点,可以向其PUT 文件 photo 和 filename。当尝试使用我所做的更改 PUT 文件时,这些文件永远不会触及我的自定义存储。标题是正确的(Content-Type:multipart/form-data),并且在 DRF 2.x 中一切正常。
我注意到我需要在我的 View 中使用 MultiPartParser 才能使用 fileField,所以现在我的 View 使用 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 中遗漏了什么 - 为什么上传的文件永远不会触及我的自定义存储?
请您参考如下方法:
Django REST Framework 3 弃用了 request.DATA 和 request.FILES 属性 in favor of a unified request.data property .序列化程序也进行了更新以删除 files 参数,仍然保留 data 参数,它应该是 request.data 而不是 请求.DATA.
在您的示例中,您似乎正在更改传入数据,因为您已将其设置为变量 postData,但该变量未包含在内。很可能,您没有使用 request.data,问题是您只获取没有文件的数据,而不是您期望的完整数据。
您应该能够通过记录 request.data 和 postData 的值来验证这一点,并检查 request.data 是否包含您尝试发送的图像。
