详解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爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解

    python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解

    这篇文章主要介绍了python爬虫利用selenium实现自动翻页爬取某鱼数据的思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • python图片剪裁代码(图片按四个点坐标剪裁)

    python图片剪裁代码(图片按四个点坐标剪裁)

    这篇文章主要介绍了python图片剪裁代码(图片按四个点坐标剪裁),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • python字符串常用方法及文件简单读写的操作方法

    python字符串常用方法及文件简单读写的操作方法

    字符串(sting)是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符。本文给大家介绍python字符串常用方法及文件简单读写的操作方法,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2020-03-03
  • 使用Pytorch训练two-head网络的操作

    使用Pytorch训练two-head网络的操作

    这篇文章主要介绍了使用Pytorch训练two-head网络的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-05-05
  • pygame游戏之旅 添加游戏暂停功能

    pygame游戏之旅 添加游戏暂停功能

    这篇文章主要为大家详细介绍了pygame游戏之旅的第13篇, 教大家如何添加游戏暂停功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • 基于Python爬取爱奇艺资源过程解析

    基于Python爬取爱奇艺资源过程解析

    这篇文章主要介绍了基于Python爬取爱奇艺资源过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • 用Python进行数据清洗以及值处理

    用Python进行数据清洗以及值处理

    这篇文章主要介绍了用Python进行数据清洗以及值处理,数据分析中,数据清洗是一个必备阶段。数据分析所使用的数据一般都很庞大,致使数据不可避免的出现重复、缺失、异常值等异常数据,如果忽视这些异常数据,可能导致分析结果的准确性,需要的朋友可以参考下
    2023-07-07
  • python查看微信好友是否删除自己

    python查看微信好友是否删除自己

    这篇文章主要为大家详细介绍了python查看微信好友是否删除自己,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 使用beaker让Facebook的Bottle框架支持session功能

    使用beaker让Facebook的Bottle框架支持session功能

    这篇文章主要介绍了使用beaker让Facebook的Bottle框架支持session功能,session在Python的Django等框架中内置但在Bottle中并没有被集成,需要的朋友可以参考下
    2015-04-04
  • 解决win10 vscode 无法激活python 虚拟环境的问题

    解决win10 vscode 无法激活python 虚拟环境的问题

    这篇文章主要介绍了win10 vscode 无法激活python 虚拟环境的解决办法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-10-10

最新评论