升级期间Django rest序列化程序验证错误

2024-03-28 14:02:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个单独的序列化程序来更新用户的帐户,出于某种原因,每当我尝试使用无效的输入时,它不会将验证错误作为响应发送,它只发送回设置的原始值。旧用户名是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)

Tags: instancename程序datareturnif序列化def
1条回答
网友
1楼 · 发布于 2024-03-28 14:02:16

您可能的解决方案是raise-exception。更改此行

 if serializer.is_valid():
        serializer.save()

 if serializer.is_valid(raise_exception=True):
        serializer.save()

也不需要在序列化程序中覆盖update方法。你知道吗

validated_data.get('username', instance.username)行中,我们从validate\u data dictionary对象获取username如果它不存在,那么设置这个值instance.username名称. 顺便说一句,还有一个补丁请求,您应该以状态代码200 ok not 201 created来响应。你知道吗

相关问题 更多 >