參數校驗的幾種方式
如果默認的字段類型和選項不能滿足需求,需要再補充校驗行爲,可以使用以下三種方法:
通過字段中的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