參數校驗的多種方式

參數校驗的幾種方式
如果默認的字段類型和選項不能滿足需求,需要再補充校驗行爲,可以使用以下三種方法:

通過字段中的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章