当前位置: 首页 > 知识库问答 >
问题:

python - DRF框架序列化器全局校验获取不到参数?

饶明亮
2023-05-05

view层代码如下:

class LoginView(APIView):
    """
    用户登陆
    """

    def post(self, request):
        try:
            # 获取手机号码
            mobile = request.data.get('mobile')
            # 查询用户是否存在
            user = UserProfile.objects.get(username=mobile)
        # 用户不存在
        except UserProfile.DoesNotExist:
            serializer_obj = LoginSerializer(data=request.data)
            # 校验数据
            if serializer_obj.is_valid():
                # 保存数据
                user = serializer_obj.save()
                return Response({'token': get_tokens(user)})

            return Response({'detail': '登陆失败'}, status=404)
        else:
            # 判断用户是否被封禁
            if not user.is_active:
                Response({'detail': '该用户已被封禁'}, status=404)
            return Response({'token': get_tokens(user)})

serializer代码

class LoginSerializer(serializers.Serializer):
    """
    登陆与注册
    """
    id = serializers.IntegerField(read_only=True)
    username = serializers.CharField(read_only=True)
    avatar = serializers.CharField(max_length=255, read_only=True)
    user_type = serializers.IntegerField(read_only=True)
    score = serializers.IntegerField(read_only=True)
    # 登陆类型
    login_type = serializers.IntegerField(min_value=1, max_value=1, required=True)
    # 请求code
    code = serializers.CharField(write_only=True, max_length=255, required=True)
    # 手机号码
    mobile = serializers.CharField(max_length=11, min_length=11, required=True)

    # 全局校验
    def validate(self, attrs):

        print(attrs['code'])
        print('校验数据', attrs)

        return attrs

全局校验达不到attr的值,程序也不报错

共有1个答案

万俟鸿波
2023-05-05

您的问题描述中,提到您在全局校验时无法访问 attrs 的值,但程序没有报错。根据您提供的代码,我发现在 LoginView 类的 post 方法中,当用户不存在时,您创建了 LoginSerializer 对象并进行了校验。但在这之前,您没有获取并处理请求中的 codelogin_type 数据。

要解决这个问题,请确保您从请求数据中获取所需的参数,然后将其传递给 LoginSerializer,以便在全局校验中使用。以下是您可以尝试的方法:

LoginViewpost 方法中,首先获取 codelogin_type 参数:

code = request.data.get('code')
login_type = request.data.get('login_type')

然后,在创建 LoginSerializer 对象时,将这些参数传递给它:

serializer_obj = LoginSerializer(data={
    'code': code,
    'login_type': login_type,
    'mobile': mobile
})

这样,在进行全局校验时,您应该能够访问 attrs 中的这些值。如果仍然出现问题,请检查您的请求数据是否包含所需的参数,以及您的代码中是否存在其他潜在问题。

 类似资料:
  • 一套 RESTful Web API,最基本的要求就是能为调用该 API 的客户端提供符合要求的数据类型,而能否提供符合要求的数据类型,序列化器是关键。上一节中,我们通过短短 6 行代码,构建了一个序列化器,那么序列化器是如何工作的呢?这一节,我们就带领大家手动构建一个序列化器,并深入介绍序列化器的详细使用方法。 1. 构建序列化器 我们在已有的一个数据库模型类 StudentsInfo: # m

  • 本文向大家介绍springboot使用校验框架validation校验的示例,包括了springboot使用校验框架validation校验的示例的使用技巧和注意事项,需要的朋友参考一下 b/s系统中对http请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的。 Spring3支持JSR-303验证框架,JSR-303 是Java

  • 问题内容: 我是Django REST框架的初学者,需要你的建议。我正在开发Web服务。该服务必须提供与其他服务的REST接口。我需要实现的REST接口无法直接与我的模型一起使用(我的意思是获取,放置,发布,删除操作)。相反,它为其他服务提供了一些计算结果。根据请求,我的服务会进行一些计算,只是将结果返回(不将结果存储在自己的数据库中)。 以下是我对如何实现REST接口的理解。纠正我,如果我错了。

  • 我是Django REST框架的初学者,需要您的建议。我正在开发一个web服务。该服务必须向其他服务提供REST接口。我需要实现的REST接口并不直接与我的模型一起工作(我指的是get、put、post和delete操作)。取而代之的是,它向其他服务提供一些计算结果。在一个请求中,我的服务进行一些计算并返回结果(不将结果存储在自己的数据库中)。 下面是我对如何实现REST接口的理解。纠正我,如果我

  • 我正在使用带有Spring启动的OAuth2。我是奥斯的新手。我得到了这个 考虑在运行我的 Spring 启动应用程序时在您的配置异常中定义类型为“org.springframework.security.authentication.AuthenticationManager”的 bean。我在StackOverflow中看到了其他一些问题的答案,但它们并没有满足我的需求。我正在使用 Sprin

  • 我有一个模型,它使用一个通用外键,使用“content\u type”字段来存储内容类型,“object\u id”来存储对象id。这个模型需要使用CRUD API进行操作,我使用的是DRF。我有一个模型的序列化程序,但我遇到了一点问题。如果我只是将content\u type添加到如下字段列表中 序列化程序将JSON表示设置为ContentType模型实例的ID。API的用户不知道这些ID,我不