Django-restframework Serializer验证

本文介绍了Django-restframework中自带的Serializer验证器,包括UniqueValidator用于唯一性验证,UniqueTogetherValidator确保特定字段组合的唯一性,以及如何在序列化类中定义和自定义字段验证。

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

自带验证器

1、UniqueValidator

用于验证(唯一)unique=True的字段,常用参数:

  • queryset: required,用于明确验证唯一性集合,必须设置
  • message:当验证失败时的提示信息
from rest_framework.validators import UniqueValidator

slug = SlugField(
    max_length=100,
    validators=[UniqueValidator(queryset=BlogPost.objects.all())]
)

2、 UniqueTogetherValidator

  • queryset:required,用于明确验证唯一性集合,必须设置
  • fields: required,字段列表或者元组,字段必须是序列化类中存在的字段
  • message:当验证失败时的提示信息
  • UniqueTogetherValidator有一个隐性要求就是验证的字段必须要提供值,除非设置了一个默认值
from rest_framework.validators import UniqueTogetherValidator

class ExampleSerializer(serializers.Serializer):
    class Meta:
        validators = [
            UniqueTogetherValidator(
                queryset=ToDoItem.objects.all(),
                fields=('list', 'position')
            )
        ]

3、serializer 返回字段定义

 	# 所有字段。attrs是字段验证合法之后返回的总的dict
    def validate(self, attrs):
        #前端没有传mobile值到后端,这里添加进来
        attrs["mobile"] = attrs["username"]
        #code是自己添加得,数据库中并没有这个字段,验证完就删除掉
        del attrs["code"]
        return attrs

4、自定义字段验证格式validate_<field_name>,返回的是验证字段的值或是serializers.ValidationError

class MobileVerifySerializer(serializers.ModelSerializer):

    #CareerUser中没有code字段,这里需要自定义一个code序列化字段
    code = serializers.CharField(required=True, write_only=True, max_length=4, min_length=4,
                                 error_messages={
                                        "blank": "请输入验证码",
                                        "required": "请输入验证码",
                                        "max_length": "验证码格式错误",
                                        "min_length": "验证码格式错误"
                                 },
                                help_text="验证码")
    #验证用户名是否存在
    username = serializers.CharField(label="用户名", help_text="用户名", required=True, allow_blank=False,
                                     validators=[UniqueValidator(queryset=CareerUser.objects.all(), message="用户已经存在")])

    #验证code
    def validate_code(self, code):
        # 用户注册,已post方式提交注册信息,post的数据都保存在initial_data里面
        #username就是用户注册的手机号,验证码按添加时间倒序排序,为了后面验证过期,错误等
        verify_records = VerifyCode.objects.filter(mobile=self.initial_data["username"]).order_by("-add_time")

        if verify_records:
            # 最近的一个验证码
            last_record = verify_records[0]
            # 有效期为五分钟。
            five_mintes_ago = datetime.now() - timedelta(hours=0, minutes=5, seconds=0)
            if five_mintes_ago > last_record.add_time:
                raise serializers.ValidationError("验证码过期")

            if last_record.code != code:
                raise serializers.ValidationError("验证码错误")

        else:
            raise serializers.ValidationError("验证码错误")

5、验证器
序列化程序上的各个字段可以包含验证程序,通过在字段实例上声明它们

def multiple_of_ten(value):
    if value % 10 != 0:
        raise serializers.ValidationError('Not a multiple of ten')

class GameRecord(serializers.Serializer):
    score = IntegerField(validators=[multiple_of_ten])
    ...
### Django REST Framework 详细介绍 Django REST Framework(DRF)是一个强大且灵活的工具包,专为构建基于Django的Web API而设计[^1]。DRF不仅简化了RESTful API的开发过程,还提供了一系列特性来增强API的功能性和安全性。 #### 主要特点 - **可浏览的API**:DRF允许开发者创建易于使用的浏览器友好的API界面,方便测试和调试。 - **序列化支持**:内置强大的序列化机制可以轻松转换复杂的数据结构到JSON或其他格式。 - **身份验证与授权**:提供了多种认证方式以及细粒度的权限控制系统。 - **分页处理**:自动实现数据列表的结果分页显示。 - **版本管理**:帮助维护不同版本之间的兼容性变化。 #### 安装配置 为了开始使用DRF,在项目环境中安装`djangorestframework`库即可: ```bash pip install djangorestframework ``` 接着在项目的`settings.py`文件中添加应用程序名称至INSTALLED_APPS列表内: ```python INSTALLED_APPS = [ ... 'rest_framework', ] ``` #### 基本概念 ##### ViewSets 和 Routers 通过定义视图集(ViewSet),能够更简洁地映射HTTP方法到相应的操作上;路由(Router)则负责自动生成URL模式并将其关联到这些视图集中[^5]。 例如,在`views.py`里声明一个名为`BookInfoViewSet`的视图集合,并利用默认路由器注册该视图: ```python from rest_framework import viewsets, routers from .models import BookInfo from .serializers import BookSerializer class BookInfoViewSet(viewsets.ModelViewSet): queryset = BookInfo.objects.all() serializer_class = BookSerializer router = routers.DefaultRouter() router.register(r'books', BookInfoViewSet) ``` 随后只需将上述代码中的`router.urls`加入到主urls配置当中便可完成整个流程设置。 #### 认证插件推荐 对于需要加强安全性的应用场景来说,建议采用`djangorestframework-simplejwt`作为JWT令牌的身份验证方案之一[^3]。此扩展模块实现了对JSON Web Tokens的支持,适用于保护敏感资源免受未授权访问的影响。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值