3

ユーザーをCRUDするためにDjango-Rest-Framework(DRF)を使用してAPIを作成しようとしています。私は作成してユーザーを読むことができましたが、何らかの理由で更新が機能しません。それは、ユーザーが既に存在するというエラーメッセージで応答するので、それを更新するのではなく、ユーザーを作成しようとしているようです。私はまだデータベースにない電子メールを渡そうとすると、新しいユーザーが作成されます。誰がなぜこれが起こっているのか知っていますか?ここで Django DRF Update User

は私のユーザーシリアライザです:

class UserSerializer(FriendlyErrorMessagesMixin, serializers.ModelSerializer): 
    password = serializers.CharField(
     max_length=128, 
     min_length=8, 
     write_only=True 
    ) 

    class Meta: 
     model = User 
     fields = ('username', 
        'email', 
        'password', 
        'name', 
        'house_number', 
        'address_line_one', 
        'address_line_two', 
        'address_line_three', 
        'city', 
        'postcode', 
        'phone_number') 
     read_only_fields = ('date_created', 'date_modified', 'username') 

    def update(self, instance, validated_data): 

     password = validated_data.pop('password', None) 

     for (key, value) in validated_data.items(): 
      setattr(instance, key, value) 

     if password is not None: 
      instance.set_password(password) 

     instance.save() 

     return instance 

、ここで私の見解である:

class UserRetrieveUpdateAPIView(RetrieveUpdateAPIView): 
    permission_classes = (IsAuthenticated,) 
    serializer_class = UserSerializer 

    def retrieve(self, request, *args, **kwargs): 
     serializer = self.serializer_class(request.user) 
     return Response(serializer.data, status=status.HTTP_200_OK) 

    def update(self, request, *args, **kwargs): 
     serializer = self.serializer_class(data=request.data, partial=True) 
     serializer.is_valid(raise_exception=True) 
     serializer.save() 

     return Response(serializer.data, status=status.HTTP_200_OK) 

答えて

2

ビューで、あなたは、Serializerそうでない場合は最初の引数として更新するインスタンスを渡す必要があります新しいオブジェクトが作成されます。

認証されたユーザを更新するには、どうなる:一般的に

def update(self, request, *args, **kwargs): 
    serializer = self.serializer_class(request.user, data=request.data, partial=True) 
    serializer.is_valid(raise_exception=True) 
    serializer.save() 
    return Response(serializer.data, status=status.HTTP_200_OK) 

を、あなたは正しいインスタンスを取得するために使用するか(GenericAPIViewから)get_objectメソッドをオーバーライドすることもできます。 retrieveupdateの両方を再実装する代わりに、

関連する問題