django rest框架保存序列化程序使用post方法失败

django rest框架保存序列化程序使用post方法失败,post,save,django-rest-framework,serialization,Post,Save,Django Rest Framework,Serialization,我正在尝试使用post方法更新配置文件对象,但在尝试保存序列化程序时收到错误消息: You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead. 我的看法是: class SettingsProfileView(AP

我正在尝试使用post方法更新配置文件对象,但在尝试保存序列化程序时收到错误消息:

You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead. 
我的看法是:

class SettingsProfileView(APIView):
    """
    Get and update user profile
    """
    queryset = models.UserProfile.objects.all()
    serializer_class = serializers.UserProfileSerializer

    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'base_/settings/profile.html'

    def get_object(self, pk):
        try:
            return models.UserProfile.objects.get(pk=pk)
        except models.UserProfile.DoesNotExist:
            raise Http404

    def get(self, request, format=None):
        if not request.user.is_authenticated:
            return Response({"error": _("User is not connected")}, status=status.HTTP_511_NETWORK_AUTHENTICATION_REQUIRED)

        try:
            profile = request.user.profile
        except models.UserProfile.DoesNotExist:
            profile = models.UserProfile(user=request.user)
            profile.key_name = request.user.username
            profile.save()

        profile = self.get_object(request.user.profile.id)
        serializer = serializers.UserProfileSerializer(profile)
        return Response({'serializer': serializer, 'profile': profile})


    def post(self, request, format=None):
        serializer = serializers.UserProfileSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 
此部分中出现错误:
serializer.save()
在我的post方法中。是因为序列化程序正在其指令方法中访问数据吗? 我的序列化程序非常基本,没有特殊代码:

class UserProfileSerializer(serializers.ModelSerializer):

    class Meta:
        model = UserProfile
        fields = ('user', 'coachs', 'is_coach', 'gender', 'weight', 'height', 'visibility', )
也许问题是因为我使用post methode而不是update

编辑(在@pleasedontalley post之后):

我尝试过使用通用视图:

class SettingsProfileView(generics.GenericAPIView): 
但是update方法没有被触发(因为我来自一篇HTML文章),所以我不得不手动启动update方法,如下所示:

 def post(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

 def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object(request.user.profile.id)
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return Response(serializer.data)
但是错误仍然是一样的。
我找不到任何使用django rest by post方法更新对象的示例。这是因为这不是一个好的继续方法吗?

最好使用通用视图,它可以防止您重写所有这些代码。但是,如果您愿意手动执行,则可以始终检查源代码以检查其执行方式:

必须将UserProfile实例传递给序列化程序

顺便说一句:您应该/必须使用PUT或PATCH进行更新,POST用于创建对象


希望这有帮助:)

最好使用通用视图,这样可以防止您重写所有这些代码。但是,如果您愿意手动执行,则可以始终检查源代码以检查其执行方式:

必须将UserProfile实例传递给序列化程序

顺便说一句:您应该/必须使用PUT或PATCH进行更新,POST用于创建对象


希望这有帮助:)

经过数小时的调试,问题似乎来自Visual Studio的断点。删除断点后,它工作正常。
可能Visual Studio试图读入serializer.data,然后影响它们。

经过数小时的调试后,问题似乎来自Visual Studio的断点。删除断点后,它工作正常。
可能Visual Studio试图读入serializer.data,然后影响它们。

谢谢@PleasedOnAttery我用您的建议编辑了问题,但仍然有相同的错误。谢谢@PleasedOnAttery我用您的建议编辑了问题,但仍然有相同的错误。
class UpdateModelMixin(object):
    """
    Update a model instance.
    """
    def update(self, request, *args, **kwargs):
        partial = kwargs.pop('partial', False)
        instance = self.get_object()
        serializer = self.get_serializer(instance, data=request.data, partial=partial)
        serializer.is_valid(raise_exception=True)
        self.perform_update(serializer)
        return Response(serializer.data)

    def perform_update(self, serializer):
        serializer.save()

    def partial_update(self, request, *args, **kwargs):
        kwargs['partial'] = True
        return self.update(request, *args, **kwargs)