drf中校验、以及校验的顺序

本文详细介绍了如何在序列化器中通过校验器实现字段长度限制、错误提示、独特性检查及多字段验证。从设置min_length和max_length约束,到Meta中配置验证规则,以及自定义函数和validate方法的应用,全面展示了数据校验在API开发中的关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1、常用几种校验,在序列化器类中我们定义,并在在对应字段中添加,失败提示

min_length=6, max_length=20,这样如果长度不在6到20 将提示错误。
error_messages={
    'min_length': '仅允许6~20个字符的确认密码',
    'max_length': '仅允许6~20个字符的确认密码', }这样填写错误时按照此处进行提示,。
 password_confirm = serializers.CharField(label='确认密码', help_text='确认密码',
                                             min_length=6, max_length=20,
                                             write_only=True,
                                             error_messages={
                                                 'min_length': '仅允许6~20个字符的确认密码',
                                                 'max_length': '仅允许6~20个字符的确认密码', })

2、也可以在序列化器的Meta中进行定义,

  extra_kwargs = {
            'username': {
                'label': '用户名',
                'help_text': '用户名',
                'min_length': 6,
                'max_length': 20,
                'error_messages': {
                    'min_length': '仅允许6-20个字符的用户名',
                    'max_length': '仅允许6-20个字符的用户名',
                }
            },
            'email': {
                'label': '邮箱',
                'help_text': '邮箱',
                'write_only': True,
                'required': True,
                # 添加邮箱重复校验
                'validators': [UniqueValidator(queryset=User.objects.all(), message='此邮箱已注册')],
            },

3.在meta中使用校验器,validators中使用功能唯一检验UniqueValidator,需要指定查询集,

如果饿哦们定义了一个函数,规定必须以项目包含项目关键字。

def is_contains_keyword(value):
    if '项目' not in value:
        raise serializers.ValidationError('项目名称中必须得包含“项目”关键字')

可以这样进行校验。

name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=20, min_length=5,
                             error_messages={
                                 'min_length': '项目名称不能少于5位',
                                 'max_length': '项目名称不能超过20位'
                             }, validators=[UniqueValidator(queryset=Projects.objects.all(), message='项目名称不能重复'),
                                            is_contains_keyword])

4、还可以重写validate函数,进行多字段校验,

def validate(self, attrs):
    if attrs.get('password') != attrs.get('password_confirm'):
        raise serializers.ValidationError('密码与确认密码不一致')
    attrs.pop('password_confirm')
    return attrs

5、还可以定义validate_name,进行对name字段的单字段校验。

def validate_name(self, attr: str):
    if not attr.endswith('项目'):
        raise serializers.ValidationError('项目名称必须得以“项目”结尾')
    return attr

我们进行数据创建是发生了什么?数据时怎样进行校验的。

1、前端请求后,会调用到CreateModelMixin中的create函数,然后会调用is_valid进行数据校验

serializer.is_valid(raise_exception=True)

2、在is_valid中调用run_validation

self._validated_data = self.run_validation(self.initial_data)

3、在run_validation中依次调用to_internal_value、run_validators、validate

value = self.to_internal_value(data)
self.run_validators(value)
value = self.validate(value)

3.1在to_internal_value中,

  对每个字段类型进行校验 、调用单字段校验方法,例如:validate_name  
3.2在run_validators

获取所有的校验器进行校验,如果有错,抛出异常。

3.3value = self.validate(value)

调用多字段联合校验方法validate方法,例如进行密码和确认密码的一致性校验。

ps:如果需要校验后的数据,可以使用validated_data获取。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值