最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

一、繼承Serializer

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

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

2、寫在函數(shù)里

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

a.外部函數(shù)

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

from rest_framework import serializers

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

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

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

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

驗證多個字段

class demoSerializer(serializers.Serializer):
   name = serializers.CharField(required=True)   # required=True , 反序列化階段必填
    sex = serializers.BooleanField(default=True)  # default=True,  反序列化階段,客戶端沒有提交,則默認為True
   
   def validate(self, attrs):
        """
        驗證來自客戶端的所有數(shù)據(jù)
        類似會員注冊的密碼和確認密碼,就只能在validate方法中校驗
        validate是固定方法名,
        參數(shù):attrs,是在序列化器實例化時的data選項數(shù)據(jù)
        """
        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調(diào)用的
        """
        if data in ["python", "django"]:
            # 在序列化器中,驗證失敗可以通過拋出異常的方式來告知 is_valid
            raise serializers.ValidationError(detail="錯誤信息", code="validate_name")
        # 驗證成功以后,必須返回數(shù)據(jù),否則最終的驗證結(jié)果中,就不會出現(xiàn)這個數(shù)據(jù)了。
        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調(diào)用的
       """
       if data in ["python", "django"]:
           # 在序列化器中,驗證失敗可以通過拋出異常的方式來告知 is_valid
           raise serializers.ValidationError(detail="錯誤信息", code="validate_name")
       # 驗證成功以后,必須返回數(shù)據(jù),否則最終的驗證結(jié)果中,就不會出現(xiàn)這個數(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="價格")
    class Meta:
        db_table = "mysql_demo"
        verbose_name = "demotest"
        verbose_name_plural = verbose_name

此時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": "價格不能超過100!",
                }
            }
        }

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

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

相關(guān)文章

  • Python設(shè)計實現(xiàn)的計算器功能完整實例

    Python設(shè)計實現(xiàn)的計算器功能完整實例

    這篇文章主要介紹了Python設(shè)計實現(xiàn)的計算器功能,結(jié)合完整實例形式分析了Python3.5實現(xiàn)計算器功能的正則、字符串及數(shù)值運算等相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • 解決.ui文件生成的.py文件運行不出現(xiàn)界面的方法

    解決.ui文件生成的.py文件運行不出現(xiàn)界面的方法

    今天小編就為大家分享一篇解決.ui文件生成的.py文件運行不出現(xiàn)界面的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-06-06
  • flask框架url與重定向操作實例詳解

    flask框架url與重定向操作實例詳解

    這篇文章主要介紹了flask框架url與重定向操作,結(jié)合實例形式詳細分析了flask框架URL映射、傳參、重定向等相關(guān)概念、原理與操作注意事項,需要的朋友可以參考下
    2020-01-01
  • pip如何用pipdeptree查看包依賴

    pip如何用pipdeptree查看包依賴

    這篇文章主要介紹了pip如何用pipdeptree查看包依賴問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 詳解Python的Lambda函數(shù)與排序

    詳解Python的Lambda函數(shù)與排序

    本篇文章主要是介紹了Python的Lambda函數(shù)與排序,簡單的介紹了Lambda函數(shù)的用法和排序,有需要的朋友可以了解一下。
    2016-10-10
  • Python中read()、readline()和readlines()三者間的區(qū)別和用法

    Python中read()、readline()和readlines()三者間的區(qū)別和用法

    這篇文章主要給大家介紹了關(guān)于Python中讀取文件的read()、readline()和readlines()方法三者間的區(qū)別和用法,需要的朋友可以參考下
    2017-07-07
  • Python利用filestools模塊實現(xiàn)水印添加

    Python利用filestools模塊實現(xiàn)水印添加

    最近發(fā)現(xiàn)的這款filestools非標(biāo)準(zhǔn)庫其實真正實現(xiàn)添加水印的只要一個函數(shù)的調(diào)用,一行代碼即可完成水印的添加,感興趣的快跟隨小編一起學(xué)起來吧
    2022-09-09
  • Python在CentOS系統(tǒng)中安裝和配置的深度指南

    Python在CentOS系統(tǒng)中安裝和配置的深度指南

    Python在CentOS系統(tǒng)上的安裝和配置是許多開發(fā)者和系統(tǒng)管理員遇到的第一個挑戰(zhàn),本文將詳細介紹一下CentOS安裝配置Python的具體方法,希望對大家有所幫助
    2025-09-09
  • Python自然語言處理庫之NLTK庫初級教程

    Python自然語言處理庫之NLTK庫初級教程

    NLTK(Natural Language Toolkit)是一個Python庫,用于實現(xiàn)自然語言處理(NLP)的許多任務(wù),NLTK包括一些有用的工具和資源,如文本語料庫、詞性標(biāo)注器、語法分析器等,在這篇初級教程中,我們將了解NLTK的基礎(chǔ)功能,需要的朋友可以參考下
    2023-08-08
  • python制作websocket服務(wù)器實例分享

    python制作websocket服務(wù)器實例分享

    websocket是一個瀏覽器和服務(wù)器通信的新的協(xié)議,websocket則和一般的socket一樣,使得瀏覽器和服務(wù)器建立了一個雙工的通道。今天我們就來詳細探討下使用Python實現(xiàn)websocket服務(wù)器的具體方法
    2016-11-11

最新評論

舟曲县| 周至县| 涞源县| 陕西省| 曲麻莱县| 湟源县| 崇信县| 上林县| 彰武县| 江达县| 通江县| 道孚县| 依安县| 麻城市| 绥江县| 时尚| 常山县| 大荔县| 长泰县| 康定县| 鹤山市| 堆龙德庆县| 潜江市| 青冈县| 淄博市| 右玉县| 两当县| 马山县| 九台市| 香格里拉县| 平顶山市| 永胜县| 阿拉善左旗| 朔州市| 左权县| 太谷县| 福泉市| 呼和浩特市| 博湖县| 稻城县| 巴林左旗|