Django Rest Framework upload file to a method

后端 未结 2 2017
闹比i
闹比i 2020-12-16 03:48

So i have been trying to upload a file to a method using DRF with no luck so far.

I was able to upload to a ModelViewSet using (FormParser, MultiP

2条回答
  •  太阳男子
    2020-12-16 04:20

    Here is some code of what i did to overcome this problem. Although Kevin Brown answer probably works, i find my code a little "easier" approach:

        @detail_route(
            methods=['post', 'put', 'patch', 'get'], permission_classes=[AllowAny],
            authentication_classes=[NoAuthentication], serializer_class=MultimediaSerializer,
            parser_classes=(FormParser, MultiPartParser,)
        )
        def upload_avatar(self, request, pk=None):
            # Because we are using nested resources this was the only way i found to
            # upload a file. Maybe there is a better way
            if request.method in ['PATCH', 'POST']:
                avatar = request.FILES.get('avatar')
                if not avatar:
                    return Response(status=404)
    
                try:
                    woman = WomenNativePassport.objects.get(pk=pk)
                except WomenNativePassport.DoesNotExist:
                    return Response(status=404)
                else:
                    request.FILES['thumbnail'] = request.FILES['avatar']
                    serializer = AvatarSerializer(
                        data=request.DATA, files=request.FILES
                    )
                    if serializer.is_valid():
                        woman.avatar.thumbnail.save(str(avatar), File(avatar))
                        return Response(status=204)
                    else:
                        return Response(status=404)
            else:
                multimedia = Multimedia.objects.filter(user_profiles_avatares__pk=pk)
                page = self.paginate_queryset(multimedia)
                serializer = self.get_pagination_serializer(page)
                return Response(serializer.data)
    
    
    # serializer 
    
    class AvatarSerializer(serializers.Serializer):
        thumbnail = serializers.ImageField()
    

提交回复
热议问题