我有一个单独的序列化程序来更新用户的帐户,出于某种原因,每当我尝试使用无效的输入时,它不会将验证错误作为响应发送,它只发送回设置的原始值。旧用户名是abc123,如果我试图更新它到abc123*我想它抛出一个错误,说它不是一个正确的格式,但它只是发回abc123作为序列化程序.data. 有人知道为什么会这样吗?你知道吗
序列化程序
class UpdateAccountSerializer(serializers.ModelSerializer):
username = serializers.CharField(max_length=16)
full_name = serializers.CharField(max_length=50)
class Meta:
model = Account
fields = ['username', 'full_name']
def validate_username(self, username):
if Account.objects.filter(username=username).exists():
raise serializers.ValidationError(_("This username is taken."))
if not re.fullmatch(r'^[a-zA-Z0-9_]+$', username):
raise serializers.ValidationError(
_("Usernames must be alphanumeric, and can only include _ as special characters."))
return username
def validate_full_name(self, full_name):
if not re.fullmatch(r'^[a-zA-Z ]+$', full_name):
raise serializers.ValidationError(
_("Invalid name."))
return full_name
def update(self, instance, validated_data):
instance.username = validated_data.get('username', instance.username)
instance.full_name = validated_data.get(
'full_name', instance.full_name)
instance.save()
return instance
查看
class UpdateAccountView(APIView):
def patch(self, request, pk, format=None):
account = Account.objects.filter(id=pk)
if account.exists():
account = account[0]
if request.user == account:
serializer = UpdateAccountSerializer(
account, data=request.data, partial=True)
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)
return Response(status=status.HTTP_404_NOT_FOUND)
如果您想知道为什么我要使用单独的序列化程序进行注册和更新,那是因为这些字段应该是唯一允许用户自由更新的字段。你知道吗
我最好的猜测是因为这些线(下面),但我找不到一个解决办法。你知道吗
instance.username = validated_data.get('username', instance.username)
instance.full_name = validated_data.get('full_name', instance.full_name)
您可能的解决方案是
raise-exception
。更改此行至
也不需要在序列化程序中覆盖update方法。你知道吗
在
validated_data.get('username', instance.username)
行中,我们从validate\u data dictionary对象获取username如果它不存在,那么设置这个值instance.username名称. 顺便说一句,还有一个补丁请求,您应该以状态代码200 ok not 201 created来响应。你知道吗相关问题 更多 >
编程相关推荐