如何通过Django Rest框架上传图像?

如何通过Django Rest框架上传图像?,django,django-rest-framework,django-rest-viewsets,Django,Django Rest Framework,Django Rest Viewsets,这是包含ImageField的我的模型: 序列化程序: class ProfileChangeSerializer(serializers.ModelSerializer): class Meta: model = Profile fields = [ 'new_article_notifications_enabled', 'new_comment_notifications_enabled',

这是包含ImageField的我的模型:

序列化程序:

class ProfileChangeSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = [
            'new_article_notifications_enabled',
            'new_comment_notifications_enabled',
            'new_comment_answer_notifications_enabled',
            'userpic',
            'city',
            'webpage',
            'about_me',
            'favorite_brands',
        ]

    def update(self, instance, validated_data):
        Profile.objects.filter(id=instance.pk).update(**validated_data)
        return instance
视图:


所以,当我试图通过Django Rest框架界面上传userpic时,它会将超链接更新到图像,但不会在媒体文件夹中创建图像文件。当我通过django管理界面上传图像时,一切正常。我错在哪里?

我认为您不需要重写序列化程序更新方法。您只需按如下所示覆盖put at View:

def put(self, request, *args, **kwargs):
        serializer = ProfileChangeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

顺便问一下,您是如何从前端发送图像数据的?我希望您使用的是jquery FormData,就像在

中一样,很高兴它能帮助您!
class ProfileChangeAPIView(generics.RetrieveAPIView,
                           mixins.DestroyModelMixin,
                           mixins.UpdateModelMixin):
    permission_classes = (
        permissions.IsAuthenticated,
    )
    serializer_class = ProfileChangeSerializer
    parser_classes = (MultiPartParser, FormParser,)

    def get_object(self):
        if not Profile.objects.filter(user__id=self.request.user.pk).exists():
            return Profile.objects.create(user=self.request.user)
        return self.request.user.profile

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)
def put(self, request, *args, **kwargs):
        serializer = ProfileChangeSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)