如何在django rest框架中上传多个文件

Dee*_*015 10 python django angularjs django-rest-framework

在django rest框架中,我可以使用danialfarid/ng-file-upload上传单个文件

views.py:

class PhotoViewSet(viewsets.ModelViewSet):
    serializer_class = PhotoSerializer
    parser_classes = (MultiPartParser, FormParser,)
    queryset=Photo.objects.all()

    def perform_create(self, serializer):
        serializer.save(blogs=Blogs.objects.latest('created_at'),
                   image=self.request.data.get('image'))
Run Code Online (Sandbox Code Playgroud)

serializers.py:

class PhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo
Run Code Online (Sandbox Code Playgroud)

models.py:

class Photo(models.Model):
    blogs = models.ForeignKey(Blogs, related_name='blogs_img')
    image = models.ImageField(upload_to=content_file_name)
Run Code Online (Sandbox Code Playgroud)

当我尝试上传多个文件时.我进去了

chrome开发人员工具:请求有效负载

------WebKitFormBoundaryjOsYUxPLKB1N69Zn
Content-Disposition: form-data; name="image[0]"; filename="datacable.jpg"
Content-Type: image/jpeg


------WebKitFormBoundaryjOsYUxPLKB1N69Zn
Content-Disposition: form-data; name="image[1]"; filename="datacable2.jpg"
Content-Type: image/jpeg
Run Code Online (Sandbox Code Playgroud)

响应:

{"image":["No file was submitted."]}
Run Code Online (Sandbox Code Playgroud)

我不知道如何编写用于上传多个文件的序列化程序.任何身体请帮助.

提前致谢

Dee*_*015 17

我设法解决这个问题,我希望它能帮助社区

serializers.py:

class FileListSerializer ( serializers.Serializer ) :
    image = serializers.ListField(
                       child=serializers.FileField( max_length=100000,
                                         allow_empty_file=False,
                                         use_url=False )
                                )
    def create(self, validated_data):
        blogs=Blogs.objects.latest('created_at')
        image=validated_data.pop('image')
        for img in image:
            photo=Photo.objects.create(image=img,blogs=blogs,**validated_data)
        return photo

class PhotoSerializer(serializers.ModelSerializer):

    class Meta:
        model = Photo
        read_only_fields = ("blogs",)
Run Code Online (Sandbox Code Playgroud)

views.py:

class PhotoViewSet(viewsets.ModelViewSet):
    serializer_class = FileListSerializer
    parser_classes = (MultiPartParser, FormParser,)
    queryset=Photo.objects.all()
Run Code Online (Sandbox Code Playgroud)

  • 我试图按原样复制此解决方案,但在 POST 和 GET 期间收到错误“字节”对象没有属性“名称”。虽然文件已上传并且条目已在数据库中进行,但响应有错误。 (5认同)

小智 7

我不太清楚,但这是有效的......这是我的视图集。

def perform_create(self, serializer):
    obj = serializer.save()
    for f in self.request.data.getlist('files'):
        mf = MyFile.objects.create(file=f)
        obj.files.add(mf)
Run Code Online (Sandbox Code Playgroud)

  • `getlist` 是一个救世主。我正在从请求中“获取”数据,这使得数据无法识别。 (3认同)