How to upload multiple files in django rest framework

后端 未结 3 1879
小蘑菇
小蘑菇 2020-12-05 02:50

In django rest framework, I am able to upload single file using danialfarid/ng-file-upload

views.py:

class PhotoViewSet(viewsets.ModelViewSet):
             


        
相关标签:
3条回答
  • 2020-12-05 03:32

    It took me a while to find out an effective solution to this, I would like to share with you what finally worked for me. I am using reactjs and DRF.

    Here is my model :

    class MediaFile(models.Model):
        article = models.ForeignKey(Articles, on_delete=models.CASCADE, null=True)
        caption = models.CharField(max_length=500, null=True, blank=True)
        file = models.FileField('photo of article', upload_to=set_filename,
                                blank=True, null=True, default='')
        added = models.DateTimeField(auto_now_add=True)
    

    The views are standard viewsets.ModelViewSet

    class MediaFilesViewSet(viewsets.ModelViewSet):
        serializer_class = FileListSerializer
        parser_classes = (parsers.MultiPartParser, parsers.FormParser,)
        queryset=MediaFile.objects.all()
    

    In ArticleSerializer I added:

    def create(self, validated_data):
        request = self.context.get('request')
        user = request.user
        instance = Articles.objects.create(**validated_data)
        instance.publisher = user
        instance.save()
        images = request.FILES
        if images:
            try:
                for f in images.getlist('mediafiles'):
                    instance.mediafile_set.get_or_create(file=f, caption=f.name)
                    instance.save()
            except Exception as e:
                print(e)
        return instance
    

    The FRONTEND structure:

    postChangeImage = (event) =>{
        this.setState({
            is_images: true
        });
        let files = event.target.files;
        const files_array = Object.values(files);
    
        this.setState(
            {imagefile: files}
        );
    
        console.log('IMAGES ARRAY', files_array);
        files_array.map(value => {
            const urls = URL.createObjectURL(value);
            this.setState((prevState)=>(
                {postfolio:[urls, ...prevState.postfolio]}
                ));
        });
    
    };
    

    and POSTING:

    for (let i=0; i< this.state.imagefile.length; i++) {
                        form_data.append(`mediafiles`, this.state.imagefile[i]);
                    }
    
    0 讨论(0)
  • 2020-12-05 03:34

    I manage to solve this issue and I hope it will help community

    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",)
    

    views.py:

    class PhotoViewSet(viewsets.ModelViewSet):
        serializer_class = FileListSerializer
        parser_classes = (MultiPartParser, FormParser,)
        queryset=Photo.objects.all()
    
    0 讨论(0)
  • 2020-12-05 03:37

    I dont know it very well, but this is working... This is for my viewset.

    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)
    
    0 讨论(0)
提交回复
热议问题