詳解python中DRF框架的數(shù)據(jù)校驗方式
在使用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,即當驗證失敗時,不會引發(fā)異常,而是將錯誤消息存儲在序列化器的errors屬性中。 這里的e.detail指的就是demoSerializer中amount的error_message。
2、寫在函數(shù)里
繼承Serializer,寫在定義的validate函數(shù)中,一種是外部函數(shù),一種是內(nèi)部,其中寫在內(nèi)部的又分為兩種,一種是校驗多個字段,一種是校驗單個字段
a.外部函數(shù)
寫一個校驗函數(shù),在demoSerializer以外,可以導入的形式
from rest_framework import serializers
def check_num(data):
"""外部驗證函數(shù)"""
if len(data) != 3:
raise serializers.ValidationError(detail="num格式不正 確!必須是3個字符", code="check_num")
# 驗證完成以后,務必返回結果,否則最終的驗證結果沒有該數(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ù),否則最終的驗證結果中,就不會出現(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ù),否則最終的驗證結果中,就不會出現(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應該是:
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框架的數(shù)據(jù)校驗方式的文章就介紹到這了,更多相關python DRF數(shù)據(jù)校驗內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python list格式數(shù)據(jù)excel導出方法
今天小編就為大家分享一篇python list格式數(shù)據(jù)excel導出方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10
Python如何基于selenium實現(xiàn)自動登錄博客園
這篇文章主要介紹了Python如何基于selenium實現(xiàn)自動登錄博客園,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2019-12-12
Python實現(xiàn)將Excel轉換成為image的方法
今天小編就為大家分享一篇Python實現(xiàn)將Excel轉換成為image的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-10-10

