验证顺序由上至下
1、to_internal_value
通过重写to_internal_value
方法来验证,也可以在这里对数据做一些处理:
class FormSerializer(ModelSerializer):
def to_internal_value(self, data):
# 验证
logo_name = data.get('logo', None)
if not logo_name:
# to_internal_value里必须返回{"key": error}形式的错误消息
raise exceptions.ValidationError({"logo": ERROR.MISSING_PARAMS})
# 处理数据
# QueryDict对象默认不可修改
data._mutable = True
if logo_name:
data['logo'] = save_image(logo_name)
data._mutable = False
ret = super(FormSerializer, self).to_internal_value(data)
return ret
2、validate_method
自定义验证方法适合用于验证必填字段,字段值不存在时,验证方法不会运行。验证方法的命名规则是 validate_ + field_name
,假设需要验证title字段的长度:
class FormSerializer(ModelSerializer):
def validate_title(self, value):
if len(value) > 20:
raise exceptions.ValidationError(ERROR.MAX_LENGTH)
return value
3、validators
自定义验证器:
验证器对于相同类型的字段应该是可复用的。
例如,这是一个正整数验证器:
def validate_form_integer(value):
if value < 0:
raise exceptions.ValidationError(ERROR.INTEGER_ERROR)
class FormSerializer(ModelSerializer):
name = serializers.CharField(validators=[validate_form_integer])
常用内置验证器:
- UniqueValidator:
可用于unique=True对模型字段强制实施约束。它需要一个必需的参数queryset
和一个可选参数messages
:- queryset: 查询集
- messages:错误消息
class FormSerializer(ModelSerializer):
name = serializers.CharField(validators=[UniqueValidator(queryset=FORM.objects.all())])
-
**MaxValueValidator:**验证最大值
-
**MinValueValidator :**验证最小值
-
**MinLengthValidator :**验证最小长度
-
**MaxLengthValidator :**验证最大长度
-
**EmailValidator :**验证是否是邮箱格式
-
**URLValidator :**验证是否是 URL 格式
-
RegexValidator :
正则表达式的验证器:**RegexValidator **
比如现在要验证手机号码是否合格,那么我们可以通过以下代码实现:
class FormSerializer(ModelSerializer):
telephone = forms.CharField(validators[validators.RegexValidator("1[345678]\d {9}",message='请输入正确格式的手机号码!')])
validate
需要多个字段联合验证时,重写validate:
class AuthSerializer(serializers.Serializer):
def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')
if username and password:
user = authenticate(username=username, password=password)
if not user:
raise serializers.ValidationError(ERROR.AUTHORIZATION)