[英]Django DRF Update User
我正在嘗試使用 Django-Rest-Framework (DRF) 創建一個 api 來增刪改查用戶。 我已經設法創建並讀取了一個用戶,但由於某種原因,更新將不起作用。 似乎它正在嘗試創建一個用戶而不是更新它,因為它會響應“用戶名已存在”錯誤消息。 當我嘗試傳遞數據庫中不存在的電子郵件時,它只會創建一個新用戶。 有誰知道為什么會這樣?
這是我的用戶序列化程序:
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)
在視圖中,您應該將要更新的實例作為第一個參數傳遞給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
)來檢索正確的實例; 而不是重新實現retrieve
和update
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.