【问题标题】:fixed error instance object is not callable固定错误实例对象不可调用
【发布时间】:2017-11-27 14:16:57
【问题描述】:

我需要使用基于 APIView 类来编辑用户详细信息(如 first_name 、 last_name )的代码。下面给出了 serializers.py 和 views.py ,但它没有根据用户详细信息进行更改。我正在传递令牌以进行用户身份验证。任何帮助将不胜感激。

Serializers.py

class UserEditSerializer(serializers.Serializer):
    email = serializers.EmailField(required=True)
    first_name = serializers.CharField(required=True)
    last_name = serializers.CharField(required=True)

    def update(self, validated_data, instance):

        instance.first_name = validated_data.get('first_name')
        instance.email = validated_data.get('email')
        instance.last_name = validated_data.get('last_name')
        instance.save()
        return instance

Views.py

class UserEditProfile(APIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)

    def get_object(self):
        return self.request.user

    def post(self, request):
        self.object = self.get_object()
        serializer = UserEditSerializer(data=request.data)
        if serializer.is_valid():
            self.object.save()
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

【问题讨论】:

    标签: python django api django-rest-framework


    【解决方案1】:

    此视图将起作用。谢谢莉诺维亚

    class UserEditProfile(APIView):
        authentication_classes = (authentication.TokenAuthentication,)
        permission_classes = (permissions.IsAuthenticated,)
    
        def post(self, request):
            obj = User.objects.get(id=request.user.id)
            serializer = UserEditSerializer(obj, data=request.data)
            if serializer.is_valid():
                serializer.save()
                return Response(serializer.data, status=status.HTTP_200_OK)
            else:
                return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
    

    【讨论】:

      【解决方案2】:

      如果您不提供序列化程序,它如何知道它必须更新用户?

          serializer = UserEditSerializer(data=request.data)
      

      应该是:

          serializer = UserEditSerializer(self.object, data=request.data)
      

      编辑: 另外,去掉return instance之后的()

      【讨论】:

      • 还要根据文档仔细检查序列化程序的更新签名。参数顺序错误。
      • 谢谢我应用了它,但它给出了与以前一样的完整性错误 - /users/edit-profile UNIQUE 约束处的 IntegrityError 失败:auth_user.id
      猜你喜欢
      • 1970-01-01
      • 2016-06-19
      • 2011-01-27
      • 2019-09-04
      • 2021-06-11
      • 2016-10-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多