亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解python中DRF框架的數(shù)據(jù)校驗(yàn)方式

 更新時(shí)間:2023年10月22日 08:12:37   作者:何如薄倖錦衣郎  
這篇文章主要為大家詳細(xì)介紹了python中DRF框架的數(shù)據(jù)校驗(yàn)方式,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下

在使用DRF編寫接口時(shí),使用序列化器進(jìn)行反序列化,校驗(yàn)數(shù)據(jù)大致分3步

  • 在獲取反序列化的數(shù)據(jù)前,必須調(diào)用is_valid() 方法進(jìn)行驗(yàn)證,驗(yàn)證成功返回True,否則返回False。
  • 驗(yàn)證失敗,可以通過(guò)序列化器對(duì)象的errors屬性獲取錯(cuò)誤信息,返回字典,包含了字段和字段的錯(cuò)誤。如果是非字段錯(cuò)誤,可以通過(guò)修改REST framework配置中的NON_FIELD_ERRORS_KEY來(lái)控制錯(cuò)誤字典中的鍵名。
  • 驗(yàn)證成功,可以通過(guò)序列化器對(duì)象的validated_data屬性獲取數(shù)據(jù)。

一、繼承Serializer

繼承Serializer(序列化器基類,drf中所有的序列化器類都必須繼承于 Serializer),直接寫在參數(shù)里和寫在函數(shù)

1.校驗(yàn)規(guī)則直接寫在參數(shù)中

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)
          # 拿出已驗(yàn)證的數(shù)據(jù)中的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是一個(gè)可選參數(shù),用于控制是否在驗(yàn)證失敗時(shí)引發(fā)ValidationError異常。它的默認(rèn)值是False,即當(dāng)驗(yàn)證失敗時(shí),不會(huì)引發(fā)異常,而是將錯(cuò)誤消息存儲(chǔ)在序列化器的errors屬性中。 這里的e.detail指的就是demoSerializer中amount的error_message。

2、寫在函數(shù)里

繼承Serializer,寫在定義的validate函數(shù)中,一種是外部函數(shù),一種是內(nèi)部,其中寫在內(nèi)部的又分為兩種,一種是校驗(yàn)多個(gè)字段,一種是校驗(yàn)單個(gè)字段

a.外部函數(shù)

寫一個(gè)校驗(yàn)函數(shù),在demoSerializer以外,可以導(dǎo)入的形式

from rest_framework import serializers

def check_num(data):
        """外部驗(yàn)證函數(shù)"""
         if len(data) != 3:
         raise serializers.ValidationError(detail="num格式不正        確!必須是3個(gè)字符", code="check_num")
       # 驗(yàn)證完成以后,務(wù)必返回結(jié)果,否則最終的驗(yàn)證結(jié)果沒(méi)有該數(shù)據(jù)
         return data
      
class demoSerializer(serializers.Serializer):
   num = serializers.CharField(validators=[check_classmate])
     

返回給前端方式和上面一樣

b.寫在內(nèi)部函數(shù)里

內(nèi)部又分為兩個(gè),寫在demoSerializer里面,一種適合驗(yàn)證多個(gè)的validate函數(shù),一種是驗(yàn)證單個(gè)的validate_name函數(shù)

驗(yàn)證多個(gè)字段

class demoSerializer(serializers.Serializer):
   name = serializers.CharField(required=True)   # required=True , 反序列化階段必填
    sex = serializers.BooleanField(default=True)  # default=True,  反序列化階段,客戶端沒(méi)有提交,則默認(rèn)為True
   
   def validate(self, attrs):
        """
        驗(yàn)證來(lái)自客戶端的所有數(shù)據(jù)
        類似會(huì)員注冊(cè)的密碼和確認(rèn)密碼,就只能在validate方法中校驗(yàn)
        validate是固定方法名,
        參數(shù):attrs,是在序列化器實(shí)例化時(shí)的data選項(xiàng)數(shù)據(jù)
        """
        if attrs.get("name") == "xxx" and attrs.get("sex"):
            raise serializers.ValidationError(detail="錯(cuò)誤信息xx", code="validate")

        return attrs

    def validate_name(self, data):
        """驗(yàn)證單個(gè)字段
        方法名的格式必須以 validate_<字段名> 為名稱,否則序列化器不識(shí)別!
        validate開(kāi)頭的方法,會(huì)自動(dòng)被is_valid調(diào)用的
        """
        if data in ["python", "django"]:
            # 在序列化器中,驗(yàn)證失敗可以通過(guò)拋出異常的方式來(lái)告知 is_valid
            raise serializers.ValidationError(detail="錯(cuò)誤信息", code="validate_name")
        # 驗(yàn)證成功以后,必須返回?cái)?shù)據(jù),否則最終的驗(yàn)證結(jié)果中,就不會(huì)出現(xiàn)這個(gè)數(shù)據(jù)了。
        return data  

返回前端方式如上

驗(yàn)證單個(gè)字段

class demoSerializer(serializers.Serializer):
  name = serializers.CharField(required=True,
validators=[validate_name])   # required=True , 反序列化階段必填
   def validate_name(self, data):
       """驗(yàn)證單個(gè)字段
       方法名的格式必須以 validate_<字段名> 為名稱,否則序列化器不識(shí)別!
       validate開(kāi)頭的方法,會(huì)自動(dòng)被is_valid調(diào)用的
       """
       if data in ["python", "django"]:
           # 在序列化器中,驗(yàn)證失敗可以通過(guò)拋出異常的方式來(lái)告知 is_valid
           raise serializers.ValidationError(detail="錯(cuò)誤信息", code="validate_name")
       # 驗(yàn)證成功以后,必須返回?cái)?shù)據(jù),否則最終的驗(yàn)證結(jié)果中,就不會(huì)出現(xiàn)這個(gè)數(shù)據(jù)了。
       return data  

二、繼承的是ModelSerializer

models.py:

from django.db import models
# Create your models here.
class DemoModel(models.Model):
    """信息"""
    price = models.IntegerField(verbose_name="價(jià)格")
    class Meta:
        db_table = "mysql_demo"
        verbose_name = "demotest"
        verbose_name_plural = verbose_name

此時(shí)serializers.py應(yīng)該是:

from rest_framework import serializers
from .models import DemoModel  #一定要導(dǎo)入models,py里寫的model

class DemoModelSerializer(serializers.ModelSerializer):
    #...... 其他代碼
    class Meta:
        model = DemoModel
        fields = "__all__"
        extra_kwargs = {
            "age": {
                "max_value": 100,
                "error_messages": {
                    "max_value": "價(jià)格不能超過(guò)100!",
                }
            }
        }

fields = ["字段1","字段2",....] 我這里的all指的是所有的字段。 views.py返回給前端的代碼和上面相同

到此這篇關(guān)于詳解python中DRF框架的數(shù)據(jù)校驗(yàn)方式的文章就介紹到這了,更多相關(guān)python DRF數(shù)據(jù)校驗(yàn)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python中的pprint打印模塊

    Python中的pprint打印模塊

    這篇文章主要介紹了Python中的pprint打印模塊,??pprint()??采用分行打印輸出,下文關(guān)于其相關(guān)介紹,需要的小伙伴可以參考一下
    2022-05-05
  • PyTorch學(xué)習(xí)之軟件準(zhǔn)備與基本操作總結(jié)

    PyTorch學(xué)習(xí)之軟件準(zhǔn)備與基本操作總結(jié)

    這篇文章主要介紹了PyTorch學(xué)習(xí)之軟件準(zhǔn)備與基本操作總結(jié),文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • python 接口_從協(xié)議到抽象基類詳解

    python 接口_從協(xié)議到抽象基類詳解

    下面小編就為大家?guī)?lái)一篇python 接口_從協(xié)議到抽象基類詳解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-08-08
  • 20行Python代碼實(shí)現(xiàn)視頻字符化功能

    20行Python代碼實(shí)現(xiàn)視頻字符化功能

    這篇文章主要介紹了20行Python代碼實(shí)現(xiàn)視頻字符化功能,本文通過(guò)實(shí)例代碼截圖的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Pyinstaller打包工具的使用以及避坑

    Pyinstaller打包工具的使用以及避坑

    本文主要的是pyinstaller在windows下的基本使用和基礎(chǔ)避坑,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • 用Python遍歷C盤dll文件的方法

    用Python遍歷C盤dll文件的方法

    這篇文章主要介紹了用Python遍歷C盤dll文件的方法,用fnmatch模塊實(shí)現(xiàn)起來(lái)非常簡(jiǎn)單,需要的朋友可以參考下
    2015-05-05
  • python list格式數(shù)據(jù)excel導(dǎo)出方法

    python list格式數(shù)據(jù)excel導(dǎo)出方法

    今天小編就為大家分享一篇python list格式數(shù)據(jù)excel導(dǎo)出方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python如何基于selenium實(shí)現(xiàn)自動(dòng)登錄博客園

    Python如何基于selenium實(shí)現(xiàn)自動(dòng)登錄博客園

    這篇文章主要介紹了Python如何基于selenium實(shí)現(xiàn)自動(dòng)登錄博客園,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成為image的方法

    Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成為image的方法

    今天小編就為大家分享一篇Python實(shí)現(xiàn)將Excel轉(zhuǎn)換成為image的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-10-10
  • Python列表推導(dǎo)式與生成器表達(dá)式用法示例

    Python列表推導(dǎo)式與生成器表達(dá)式用法示例

    這篇文章主要介紹了Python列表推導(dǎo)式與生成器表達(dá)式用法,簡(jiǎn)單描述了Python列表推導(dǎo)式與生成器表達(dá)式的概念、功能,并結(jié)合具體實(shí)例形式分析了Python列表推導(dǎo)式與生成器表達(dá)式簡(jiǎn)單使用技巧,需要的朋友可以參考下
    2018-02-02

最新評(píng)論