DRF序列化器自定义验证失效:validate方法为何不被调用?

DDD
发布: 2025-03-09 11:18:02
原创
654人浏览过

在drf序列化器中,自定义验证失效的排查

本文将针对drf序列化器中的验证问题进行分析。问题描述如下:开发者在loginserializer中使用了validate方法进行全局验证,期望在其中生成token并赋值给token字段,但验证似乎无效,validate方法中打印attrs也未如预期输出。代码如下:

class LoginSerializer(serializers.Serializer):
    """
    登陆与注册
    """
    id = serializers.IntegerField(read_only=True)
    username = serializers.CharField(max_length=20, error_messages={
        'required': '用户名不能为空',
        'max_length': '用户名不能超过20个字符'
    })
    openid = serializers.CharField(source='open_id', max_length=255, write_only=True)
    unionid = serializers.CharField(source='union_id', max_length=255, write_only=True)
    avatar = serializers.CharField(max_length=255)
    login_type = serializers.IntegerField(min_value=1, max_value=1)
    user_type = serializers.IntegerField(read_only=True)
    score = serializers.IntegerField(read_only=True)
    token = serializers.CharField(read_only=True)

    def create(self, validated_data):
        return UserProfile.objects.create(**validated_data)

    def validate(self, attrs):
        print(self.context.get('attrs'))
        print(self.context.get('user'))
        attrs['token'] = get_tokens(self.context.get('user'))
        return attrs
登录后复制

问题在于validate方法并没有被正确调用。validate方法通常是由is_valid()方法调用的。 is_valid()方法在序列化器数据进行校验时被调用,如果validate方法没有被执行,可能是因为调用序列化器的代码没有正确地调用is_valid()方法,或者is_valid()方法返回了false,导致validate方法被跳过。 因此,需要检查应用层是如何调用这个序列化器的,例如:查看视图函数中序列化器实例化和数据处理的逻辑。 只有确定了应用层的调用方式,才能准确判断validate方法未被执行的原因。 确认应用层正确调用is_valid()方法后,才能进一步排查其他潜在问题,例如get_tokens函数是否正确运行,self.context中是否正确包含了attrs和user数据等。

以上就是DRF序列化器自定义验证失效:validate方法为何不被调用?的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号