参数校验的几种方式
如果默认的字段类型和选项不能满足需求,需要再补充校验行为,可以使用以下三种方法:
通过字段中的validators 选项进行校验
validate_<field_name>方法:对<field_name>字段进行验证
validate方法:对多个字段进行比较校验
一、通过 validators选项校验
在序列化器字段中添加validators选项参数进行校验,例如:
def validate_name(value):
# 校验部门名称
if not re.match('^[\u4e00-\u9fa5]+$', value):
raise ValidationError('部门名称只能为中文')
return value
class DepartmentSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True, label='ID')
name = serializers.CharField(max_length=20, label='部门名称',
required=True, allow_null=True, validators=[validate_name])
二、validate_:对<field_name>字段进行验证
注意:若校验失败,则 raise ValidationError异常
class DepartmentSerializer(serializers.Serializer):
"""部门数据序列化器"""
...
def validate_name(self, value):
# 校验部门名称
if not re.match('^[\u4e00-\u9fa5]+$', value):
raise ValidationError('部门名称只能为中文')
return value
测试
>>> from users.models import *
>>> from users.serializers import *
>>> s = DepartmentSerializer(data={'name':'研-发部', 'create_date':'2018-1-1'})
>>> s.is_valid()
False
>>> s.errors
{'name': [ErrorDetail(string='部门名称只能为中文或英文字母', code='invalid')]}
三、validate:同时对多个字段进行比较验证
用户注册,校验两次输入的密码是否一致
# 模型: users/models.py
class User(models.Model):
password = models.CharField(max_length=30)
# 序列化器: users/serializer.py
class UserSerializer(serializers.Serializer):
password = serializers.CharField(max_length=30, write_only=True)
password2 = serializers.CharField(max_length=30, write_only=True)
def validate(self, attrs):
# 校验两次输入的密码是否正确
password = attrs['password']
password2 = attrs['password2']
if password != password2:
raise serializers.ValidationError('两次输入的密码不一样')
return attrs
测试
>>> from users.models import *
>>> from users.serializers import *
>>> s = UserSerializer(data={'password':'12345', 'password2': '12345x'})
>>> s.is_valid()
False
>>> s = UserSerializer(data={'password':'12345', 'password2': '12345'})
>>> s.is_valid()
True