drf --反序列化的字段验证

类似于Django的form组件

注意:验证的顺序是,先验证单字段,再验证多字段

一.序列化的文件,serializers.py代码示例

1.单字段校验(方式一)

class StudentSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8,required=True)
    age = serializers.IntegerField(max_value=120,required=True)
    sex = serializers.IntegerField(default=1)
    

    #validate_name函数名中的name必现为定义的字段名,attr参数可以接收该字段名传入的值
    def validate_name(self,attr):
        if attr == "老王":
            raise serializers.ValidationError('隔壁老王不能进')
        #不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
        return attr

2.单字段校验(方式二)

from rest_framework import serializers

#该函数名可以自己随意定义
def chick_class_name(data):
    if data == "老王":
        raise serializers.ValidationError('隔壁老王不行')
    #不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
    return data

class StudentSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8,required=True,validators=[chick_class_name])  #将自己定义的函数名,传入要校验字段的validators属性中

    age = serializers.IntegerField(max_value=120,required=True)
    sex = serializers.IntegerField(default=1)

3.多字段校验

from rest_framework import serializers

class StudentSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8,required=True)
    age = serializers.IntegerField(max_value=120,required=True)
    sex = serializers.IntegerField(default=1)

    def validate_name(self,attr):
        if attr == "老王":
            raise serializers.ValidationError('隔壁老王不能进')
        #不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
        return attr
    

    #预留的钩子函数,会将传入的数据获取,用参数attrs接收,通过字典的方式,可以取到里面的任意字段
    def validate(self, attrs):
        if attrs.get('name') == "张三" and attrs.get('age') == 26:
            raise serializers.ValidationError('26岁的张三不能进')
        #不管在校验什么字段,都需要将数据返回,不然后续不能获取到数据
        return attrs

二.视图函数示例代码,views.py

from django.views import View
from django.http import HttpResponse
from unsers.serializers import StudentSerializer
import json
# Create your views here.
class StudentView(View):
    
    #在发送POST请求的时候,记得先关闭一下CRSF中间件
    def post(self,request):
        data = json.loads(request.body)
        #将序列化的数据传入定义的反序列化类中,用data参数接收
        #'django.middleware.csrf.CsrfViewMiddleware',   在settings中注释掉该中间件就可以了
        #模拟post请求,可以用postman
        serializers = StudentSerializer(data=data)
        if serializers.is_valid():# is_valid(),可以进行数据校验,校验通过返回True,失败返回False
            print(serializers.data) #无论验证是否通过,都会返回一个普通字典
            print(serializers.validated_data) #验证通过,返回一个有序字典,验证失败,返回一个空字典
            return HttpResponse("验证成功")
        else:
            print(serializers.errors) #验证失败,返回错误字段和错误信息
            return HttpResponse("验证失败")
posted @   志强爱璇璇  阅读(59)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示