【问题标题】:How to upload multiple files with django-rest-framework如何使用 django-rest-framework 上传多个文件
【发布时间】:2019-07-31 11:17:24
【问题描述】:

我正在尝试使用 django-rest-frame 上传文件,该文件在上传单个文件时有效。但是当我上传多个文件时,只会保存最后一个文件。如何保存所有文件?

Python 3.6.2, Django 2.2.3 djangorestframework 3.10.1

下面是我的代码

vue:

<template>
    <input id="upload_file" type="file" multiple @change="v_upload_files"/>
</template>

<script>
  export default {
    data() {
      return {
        fileList: []
      };
    },
    methods: {
        v_upload_files(e) {
            let files = e.target.files;
            let formData = new FormData();
            for (let i = 0;i < files.length;i++) {
                formData.append(`file${i}`, files[i])
                // formData.append('file', files[i])
            }
            let url = '/upload/';

            axios.post(url, formData)
}
  }

}
</script>

models.py

class File(models.Model):
    file = models.FileField(blank=False, null=False)

    def __str__(self):
        return self.file.name

序列化器.py

from rest_framework import serializers
from .models import File


class FileSerializer(serializers.ModelSerializer):

    files = serializers.ListField(child=serializers.FileField())

    class Meta:
        model = File
        fields = "__all__"

views.py

from rest_framework.parsers import MultiPartParser
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework import status
from .serializers import FileSerializer

class FileUploadView(APIView):
    parser_class = (MultiPartParser,)

    def post(self, request, *args, **kwargs):

        altered_request_data = request.data.copy()
        in_memory_upload_files_list = [value for value in request.FILES.dict().values()]
        print(request.FILES.dict().values())
        altered_request_data.setlist('files', in_memory_upload_files_list)
        file_serializer = FileSerializer(data=altered_request_data)
        print(file_serializer)
        print(file_serializer.is_valid())
        if file_serializer.is_valid():
            file_serializer.save()
            print(file_serializer.data)
            return Response(file_serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(file_serializer.errors, status=status.HTTP_400_BAD_REQUEST)

上传 2 个文件

FileSerializer(data=<QueryDict: {'file{i}': [<InMemoryUploadedFile: 20190724_BRCA_report.xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)>, <InMemoryUploadedFile: 20190724_DMD_report.xlsx (application/vnd.openxmlformats-officedocument.spread
sheetml.sheet)>], 'files': [<InMemoryUploadedFile: 20190724_DMD_report.xlsx (application/vnd.openxmlformats-officedocument.spreadsheetml.sheet)>]}>):
    id = IntegerField(label='ID', read_only=True)
    files = ListField(child=FileField(), write_only=True)
    file = FileField(max_length=100)
Bad Request: /upload/

在浏览器中返回

{"file":["No file was submitted."]}

【问题讨论】:

    标签: python vue.js django-rest-framework


    【解决方案1】:

    您在序列化程序中使用 FileField,尽管它接收到多个文件,但它只能保存一个文件。

    你见过How to upload multiple files in django rest framework吗?

    如果文件类型不同或语义不同,您需要为每个要保存的文件添加更多 FileField,或者您可以将 ListField 与 FileField 一起使用,如上面的链接所示

    【讨论】:

    猜你喜欢
    • 2018-02-21
    • 2019-03-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2015-10-06
    • 2022-06-14
    • 2015-11-29
    • 2017-07-17
    相关资源
    最近更新 更多