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

新手上路,请多包涵

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

意见.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'))

序列化程序.py:

 class PhotoSerializer(serializers.ModelSerializer):
    class Meta:
        model = Photo

模型.py:

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

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

chrome 开发者工具:Request Payload

 ------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

回复:

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

我不知道如何编写用于上传多个文件的序列化程序。

原文由 Deep 3015 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 763
2 个回答

我设法解决了这个问题,希望对社区有所帮助

序列化程序.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",)

意见.py:

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

原文由 Deep 3015 发布,翻译遵循 CC BY-SA 3.0 许可协议

我不太了解,但这是有效的……这是我的观点。

 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)

原文由 Charles 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题