3

我試圖創建一個使用Django的Rest框架(DRF)api來CRUD用戶。我設法創建並閱讀了一個用戶,但出於某種原因,更新不起作用。它似乎是試圖創建一個用戶而不是更新它,因爲它用'用戶名已存在'錯誤消息進行響應。當我嘗試傳遞一個不在數據庫中的電子郵件時,它只是創建一個新用戶。有誰知道爲什麼會發生這種情況?Django DRF更新用戶

這裏是我的用戶串行:

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) 

一般情況下,你可能要使用或重寫get_object方法(從GenericAPIView)來檢索正確的實例;而不是重新實施retrieveupdate