在使用DRF编写接口时,使用序列化器进行反序列化,校验数据大致分3步
- 在获取反序列化的数据前,必须调用is_valid() 方法进行验证,验证成功返回True,否则返回False。
- 验证失败,可以通过序列化器对象的errors属性获取错误信息,返回字典,包含了字段和字段的错误。如果是非字段错误,可以通过修改REST framework配置中的NON_FIELD_ERRORS_KEY来控制错误字典中的键名。
- 验证成功,可以通过序列化器对象的validated_data属性获取数据。
一、继承Serializer
继承Serializer(序列化器基类,drf中所有的序列化器类都必须继承于 Serializer),直接写在参数里和写在函数里
1.校验规则直接写在参数中
from rest_framework import serializers
class demoSerializer(serializers.Serializer):
amount = serializers.IntegerField(max_value=100, min_value=0, error_messages={
"min_value": "The Age Filed Must Be 0 <= amount", # amount在反序列化必须是 0 <= amount <= 100
"max_value": "The amount Filed Must Be amount <= 100",
})
返回给前端:
class DemoAPIView(APIView):
def post(self, request, *args):
try:
serializer = demoSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
# 拿出已验证的数据中的data
validated_data = ser.validated_data.get('amount')
# 返回信息
return Response({"msg": "ok", "data":validated_data}, status=status.HTTP_201_CREATED)
except ValidationError as e:
return Response({"msg": "error", "error_message": e.detail}, status=status.HTTP_401_UNAUTHORIZED)
在DRF的序列化器中,raise_exception
是一个可选参数,用于控制是否在验证失败时引发ValidationError
异常。它的默认值是False
,即当验证失败时,不会引发异常,而是将错误消息存储在序列化器的errors
属性中。 这里的e.detail指的就是demoSerializer中amount的error_message。
2、写在函数里
继承Serializer,写在定义的validate函数中,一种是外部函数,一种是内部,其中写在内部的又分为两种,一种是校验多个字段,一种是校验单个字段
a.外部函数
写一个校验函数,在demoSerializer以外,可以导入的形式
from rest_framework import serializers
def check_num(data):
"""外部验证函数"""
if len(data) != 3:
raise serializers.ValidationError(detail="num格式不正 确!必须是3个字符", code="check_num")
# 验证完成以后,务必返回结果,否则最终的验证结果没有该数据
return data
class demoSerializer(serializers.Serializer):
num = serializers.CharField(validators=[check_classmate])
返回给前端方式和上面一样
b.写在内部函数里
内部又分为两个,写在demoSerializer里面,一种适合验证多个的validate函数,一种是验证单个的validate_name函数
验证多个字段
class demoSerializer(serializers.Serializer):
name = serializers.CharField(required=True) # required=True , 反序列化阶段必填
sex = serializers.BooleanField(default=True) # default=True, 反序列化阶段,客户端没有提交,则默认为True
def validate(self, attrs):
"""
验证来自客户端的所有数据
类似会员注册的密码和确认密码,就只能在validate方法中校验
validate是固定方法名,
参数:attrs,是在序列化器实例化时的data选项数据
"""
if attrs.get("name") == "xxx" and attrs.get("sex"):
raise serializers.ValidationError(detail="错误信息xx", code="validate")
return attrs
def validate_name(self, data):
"""验证单个字段
方法名的格式必须以 validate_<字段名> 为名称,否则序列化器不识别!
validate开头的方法,会自动被is_valid调用的
"""
if data in ["python", "django"]:
# 在序列化器中,验证失败可以通过抛出异常的方式来告知 is_valid
raise serializers.ValidationError(detail="错误信息", code="validate_name")
# 验证成功以后,必须返回数据,否则最终的验证结果中,就不会出现这个数据了。
return data
返回前端方式如上
验证单个字段
class demoSerializer(serializers.Serializer):
name = serializers.CharField(required=True,
validators=[validate_name]) # required=True , 反序列化阶段必填
def validate_name(self, data):
"""验证单个字段
方法名的格式必须以 validate_<字段名> 为名称,否则序列化器不识别!
validate开头的方法,会自动被is_valid调用的
"""
if data in ["python", "django"]:
# 在序列化器中,验证失败可以通过抛出异常的方式来告知 is_valid
raise serializers.ValidationError(detail="错误信息", code="validate_name")
# 验证成功以后,必须返回数据,否则最终的验证结果中,就不会出现这个数据了。
return data
二、继承的是ModelSerializer
models.py:
from django.db import models
# Create your models here.
class DemoModel(models.Model):
"""信息"""
price = models.IntegerField(verbose_name="价格")
class Meta:
db_table = "mysql_demo"
verbose_name = "demotest"
verbose_name_plural = verbose_name
此时serializers.py应该是:
from rest_framework import serializers
from .models import DemoModel #一定要导入models,py里写的model
class DemoModelSerializer(serializers.ModelSerializer):
#...... 其他代码
class Meta:
model = DemoModel
fields = "__all__"
extra_kwargs = {
"age": {
"max_value": 100,
"error_messages": {
"max_value": "价格不能超过100!",
}
}
}
fields = ["字段1","字段2",....]
我这里的all指的是所有的字段。 views.py返回给前端的代码和上面相同
题外话
当下这个大数据时代不掌握一门编程语言怎么跟的上时代呢?当下最火的编程语言Python前景一片光明!如果你也想跟上时代提升自己那么请看一下.
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python必备开发工具
工具都帮大家整理好了,安装就可直接上手!
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、Python视频合集
观看全面零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
五、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
六、面试宝典
简历模板
👉优快云大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
若有侵权,请联系删除