How to upload multiple Images using DJango Rest Framework?

前端 未结 2 1833
别跟我提以往
别跟我提以往 2020-12-14 12:50

I am able to upload a single image with the following code. If I select multiple images then only the last image among the selected image is getting uploaded.

model

相关标签:
2条回答
  • 2020-12-14 13:08

    So I finally got a workaround in my own way falling back to the basics as I didn't find any way to do it in a DRF way. I hope this answer is helpful to the Django community. I kept my model and serializers same changing the views to iterate over every image and save it using the serializer.

    views.py

    class ImageView(APIView):
        parser_classes = (MultiPartParser, FormParser)
    
        def get(self, request):
            all_images = Image.objects.all()
            serializer = ImageSerializer(all_images, many=True)
            return JsonResponse(serializer.data, safe=False)
    
        def post(self, request, *args, **kwargs):
            property_id = request.data['property_id']
    
            # converts querydict to original dict
            images = dict((request.data).lists())['image']
            flag = 1
            arr = []
            for img_name in images:
                modified_data = modify_input_for_multiple_files(property_id,
                                                                img_name)
                file_serializer = ImageSerializer(data=modified_data)
                if file_serializer.is_valid():
                    file_serializer.save()
                    arr.append(file_serializer.data)
                else:
                    flag = 0
    
            if flag == 1:
                return Response(arr, status=status.HTTP_201_CREATED)
            else:
                return Response(arr, status=status.HTTP_400_BAD_REQUEST)
    

    helpers.py

    def modify_input_for_multiple_files(property_id, image):
        dict = {}
        dict['property_id'] = property_id
        dict['image'] = image
        return dict
    

    models.py

    class Image(models.Model):
        property_id = models.ForeignKey(
                        'properties.Address',
                        null=False,
                        default=1,
                        on_delete=models.CASCADE
                    )
        image = models.ImageField(upload_to=directory_path)
    

    serializers.py

    class ImageSerializer(serializers.ModelSerializer):
        class Meta:
            model = Image
            fields = (
                'property_id',
                'image'
            )
    

    The request comes in the form of querydict. The line images = dict((request.data).lists())['image'] coverts query dict to python dict and then looping over the array under the 'image' key.

    The postman request looks like below:

    0 讨论(0)
  • 2020-12-14 13:09

    Solution for you should be using ListCreateAPIView. You dont have to implement your own view and handle everything.

    class ImageView(generics.ListCreateAPIView):
        parser_classes = (MultiPartParser, FormParser)
        queryset = Image.objects.all()
        serializer_class = ImageSerializer
    
        def get_serializer(self, *args, **kwargs):
            if isinstance(kwargs.get('data', {}), list):
                kwargs['many'] = True
            return super(CreateListModelMixin, self).get_serializer(*args, **kwargs)
    
    0 讨论(0)
提交回复
热议问题