Skip to main content
 首页 » 编程设计

python之Django Rest Framework 3 : Uploading files without request. 文件

2024年08月26日33duanxz

我注意到使用 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 是否包含您尝试发送的图像。