详解python中DRF框架的数据校验方式

 更新时间:2023年10月22日 08:12:37   作者:何如薄倖錦衣郎  
这篇文章主要为大家详细介绍了python中DRF框架的数据校验方式,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起了解一下

在使用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中DRF框架的数据校验方式的文章就介绍到这了,更多相关python DRF数据校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python控制windows系统音量实现实例

    Python控制windows系统音量实现实例

    这篇文章主要介绍了Python控制windows系统音量实现实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-01-01
  • python numpy数组复制使用实例解析

    python numpy数组复制使用实例解析

    这篇文章主要介绍了python numpy数组复制使用实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • Python numpy多维数组实现原理详解

    Python numpy多维数组实现原理详解

    这篇文章主要介绍了python numpy多维数组实现原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Python 实现数据结构中的的栈队列

    Python 实现数据结构中的的栈队列

    这篇文章主要介绍了Python 实现数据结构中的的栈,队列,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-05-05
  • python模拟预测一下新型冠状病毒肺炎的数据

    python模拟预测一下新型冠状病毒肺炎的数据

    这篇文章主要介绍了python模拟预测一下新型冠状病毒肺炎的数据 ,需要的朋友可以参考下
    2020-02-02
  • Pytorch BertModel的使用说明

    Pytorch BertModel的使用说明

    这篇文章主要介绍了Pytorch BertModel的使用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Python基于xlutils修改表格内容过程解析

    Python基于xlutils修改表格内容过程解析

    这篇文章主要介绍了Python基于xlutils修改表格内容过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • python 使用Yolact训练自己的数据集

    python 使用Yolact训练自己的数据集

    这篇文章主要介绍了python 使用Yolact训练自己的数据集,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下
    2021-04-04
  • python使用PIL剪切和拼接图片

    python使用PIL剪切和拼接图片

    这篇文章主要为大家详细介绍了python使用PIL剪切和拼接图片,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • Python学习之集合的常用方法总结

    Python学习之集合的常用方法总结

    集合并不是一种数据处理类型,而是一种中间类型。集合(set)是一个无序、不重复的元素序列,经常被用来处理两个列表进行交并差的处理性。本文将详细讲解集合的一些常用方法,感兴趣的可以了解一下
    2022-03-03

最新评论