在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方法为何不被调用?的详细内容,更多请关注知识资源分享宝库其它相关文章!
版权声明
本站内容来源于互联网搬运,
仅限用于小范围内传播学习,请在下载后24小时内删除,
如果有侵权内容、不妥之处,请第一时间联系我们删除。敬请谅解!
E-mail:dpw1001@163.com
发表评论