python - Django REST FileUpload 序列化程序返回 {'file' : None}

标签 python django django-rest-framework django-serializer

我一直在做一个需要文件上传的 Django 项目。我使用 django-rest-framework 在我的应用程序设计中使用 API 方法。我创建了我的模型、APIView 和序列化程序,但不幸的是,每次请求通过序列化程序时,upload.data 都会返回 {'file': None}。如果我只使用 request.FILES['file'] 它返回文件没有问题,但我想使用序列化数据。我在前端使用 dropzone js 上传文件。下面是我的代码。

HTML

{% extends 'base_profile.html' %}
{% load static %}
{% block title %}File Import{% endblock %}
{% block pagetitle %}File Import{% endblock %}
{% block content %}
<div class="widget">
    <div class="widget-heading clearfix">
      <h3 class="widget-title pull-left list-inline">CSV </h3>
      <button type="button" class="btn btn-primary pull-right"><i class="ti-upload mr-5"></i> Upload</button>
    </div>
    <div class="widget-body">
      <form id="type-dz" class="dropzone">{% csrf_token %}</form>
    </div>
</div>

{% endblock %}
{% block js %}
<script type="text/javascript">
    $("#type-dz").dropzone({
        url: "{% url 'api_import:file' %}",
        paramName: "file",
        acceptedFiles: ".csv",
        maxFilesize: 2,
        maxThumbnailFilesize: .5,
        dictDefaultMessage: "<i class='icon-dz fa fa-file-text-o'></i>Drop files here to upload"
});
</script>
{% endblock %}

网址.py

urlpatterns = [
    url(r'^api/import/', include('api.import_api.urls', namespace="api_import")),
]

api/urls.py

urlpatterns = [
    url(r'^file/', FileImport.as_view(), name='file'),
]

View .py

class FileImport(APIView):
    parser_classes = (MultiPartParser, FormParser,)
    serializer = ImportSerializer

    def post(self, request, format=None):
        upload = self.serializer(data=request.FILES)

        if upload.is_valid():
            file = FileUpload(file=upload.data['file'], uploaded_by=request.user.profile)
            file.save()
            return Response({'success': 'Imported successfully'})
        else:
            return Response(upload.errors, status=400)

序列化器.py

class ImportSerializer(serializers.Serializer):
    file = serializers.FileField()

模型.py

class FileUpload(models.Model):
    file = models.FileField(upload_to='files/%Y/%m/%d')
    date_uploaded = models.DateTimeField(auto_now=True)
    uploaded_by = models.ForeignKey('UserProfile', blank=True, null=True)

最佳答案

了解您如何上传文件会很有帮助。如果您正在使用 multipart/form-data 请求并正确提供"file"的 json,则最有可能的是该文件由于某种原因未能通过验证。

如果可以,从可浏览的 api 进行测试也可能会有所帮助(因为这可以保证您的请求没有问题)。

编辑:
问题是在调用 is_valid() 之后,应该使用 validated_data 字段而不是 data 字段。

关于python - Django REST FileUpload 序列化程序返回 {'file' : None},我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39887923/

相关文章:

python - 如何获取 Django 子模型中存在外键的父模型的所有对象?

django - Heroku 创建了表,但是当我要迁移时,他说没有创建

python - 发布到 Django Rest Framework 时排除某些字段

python - 如何检查 tf.estimator.inputs.numpy_input_fn 的内容?

Django:sorl-thumbnail 和 easy-thumbnail 在同一个项目中

python - 类型错误 : detail() missing 1 required positional argument: 'request'

python - 如何使 django 模型的 CharField 中仅显示最后几个字符

python-2.7 - 字符串格式化 [str.format()],字典键是数字的 str()

python - 在 python 中使用 google calendar api 创建一个 'all day' 事件

python - 反射(reflect) cx_Oracle/sqlalchemy 中的数据库表