更新時間:2020年08月07日16時45分 來源:傳智播客 瀏覽次數:
1. 字段類型和選項參數
本篇文章我們來繼續(xù)學習序列化器類定義中的字段類型和選項參數。
首先我們來回顧一下序列化器類的基本定義形式:
在定義序列化器類時,我們需要選擇對應的字段類型和設置對應的選項參數,接下來我們分別來進行講解。
2. 字段類型
下面的表格中我們列出了序列化器中常用的字段類型,對于DRF框架中序列化器所有的字段類型,我們可以到 rest_framework.fields 模塊中進行查看。
字段 | 字段構造方式 |
---|---|
BooleanField | BooleanField() |
CharField | CharField(max_length=None, min_length=None, allow_blank=False, trim_whitespace=True) |
EmailField | EmailField(max_length=None, min_length=None, allow_blank=False) |
IntegerField | IntegerField(max_value=None, min_value=None) |
FloatField | FloatField(max_value=None, min_value=None) |
DecimalField |
DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None) max_digits: 最多位數 decimal_palces: 小數點位置 |
DateTimeField | DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None) |
DateField | DateField(format=api_settings.DATE_FORMAT, input_formats=None) |
TimeField | TimeField(format=api_settings.TIME_FORMAT, input_formats=None) |
ChoiceField |
ChoiceField(choices) choices與Django的用法相同 |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
我們可以發(fā)現,序列化器類定義字段類型和Django框架中的字段類型是一樣,我們只需知道常用的字段類型就可以了,對于其他字段類型,需要的時候再去查看就可以了。
3. 選項參數
對于序列化器字段的選項參數,分別如下兩類:
·通用選項參數:任意字段類型都擁有的參數
·常用選項參數:特定字段類型才擁有的參數
3.1 通用選項參數
通用選項參數有如下常見參數:
參數名稱 | 說明 |
read_only | 默認False,若設置為True,表明對應字段只在序列化操作時起作用 |
write_only | 默認False,若設置為True,表明對應字段只在反序列化操作時起作用 |
required | 默認True,表明對應字段在數據校驗時必須傳入 |
default | 序列化和反序列化時使用的默認值 |
label | 用于HTML展示API頁面時,顯示的字段名稱,理解為對字段的注釋說明即可 |
對于這些通用的選項參數,我們需要重點理解里面紅色部分3個選項參數的作用,接下來我們來對這些選項參數做一些具體的介紹。
示例1:read_only參數 (注意對比設置之前和設置之后的效果)
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField()
# 此處將age字段的read_only參數設置為True
age = serializers.IntegerField(read_only=True)
if __name__ == "__main__":
# 準備數據
data = {'name': 'laowang', 'age': 18}
# 數據校驗
serializer = UserSerializer(data=data)
res = serializer.is_valid()
if res:
# 獲取校驗通過之后的數據
print('校驗通過:', serializer.validated_data)
else:
# 獲取校驗失敗之后的錯誤提示信息
print('校驗失?。?#39;, serializer.errors)
示例結果:
結果說明:
上面的age字段已經設置的read_only=True,所以在反序列化-數據校驗時不必傳入,即使傳了,也會忽略它的存在。
示例2:write_only參數 (注意對比設置之前和設置之后的效果)
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField()
# 此處將age字段的write_only參數設置為True
age = serializers.IntegerField(write_only=True)
if __name__ == "__main__":
# 創(chuàng)建user對象
user = User('smart', 18)
# 將user對象序列化為字典{'name': 'smart', 'age': 18}
serializer = UserSerializer(user)
# serializer.data獲取序列化之后的字典數據
print(serializer.data)
示例結果:
結果說明:
上面的age字段已經設置的write_only=True,所以在進行序列化操作時會忽略它的存在,因而上面的序列化之后的數據中只會拿user對象name屬性的值,而不會拿user對象的age屬性的值。
示例3:required參數 (注意對比設置之前和設置之后的效果)
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField()
# 此處age字段的required參數默認為True
age = serializers.IntegerField()
if __name__ == "__main__":
# 準備數據
data = {'name': 'laowang'}
# 數據校驗
serializer = UserSerializer(data=data)
res = serializer.is_valid()
if res:
# 獲取校驗通過之后的數據
print('校驗通過:', serializer.validated_data)
else:
# 獲取校驗失敗之后的錯誤提示信息
print('校驗失敗:', serializer.errors)
示例結果:
結果說明:
上面的age字段默認required=True,表明數據校驗時是必傳的,示例中未傳遞age,所以校驗失敗。
將上面示例中age字段的required設置為False:
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField()
# 此處將age字段的required參數設置為False
age = serializers.IntegerField(required=False)
if __name__ == "__main__":
# 準備數據
data = {'name': 'laowang'}
# 數據校驗
serializer = UserSerializer(data=data)
res = serializer.is_valid()
if res:
# 獲取校驗通過之后的數據
print('校驗通過:', serializer.validated_data)
else:
# 獲取校驗失敗之后的錯誤提示信息
print('校驗失?。?#39;, serializer.errors)
示例結果:
結果說明:
上面的age字段設置required=Fasle,表明數據校驗時可傳可不傳,示例中未傳遞age,校驗也能通過。
示例4:default參數 (注意對比設置之前和設置之后的效果)
1)序列化時所使用的默認值
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField()
age = serializers.IntegerField()
addr = serializers.CharField(default='默認地址')
if __name__ == "__main__":
# 創(chuàng)建user對象
user = User('smart', 18)
# 將user對象序列化為字典{'name': 'smart', 'age': 18}
serializer = UserSerializer(user)
# serializer.data獲取序列化之后的字典數據
print(serializer.data)
示例結果:
結果說明:
上面的addr字段設置了一個default默認值,在序列化user對象時,因為user對象中沒有addr屬性,所以序列化之后的數據中addr使用了默認值。
小提示:如果user對象有addr屬性,則序列化之后的字典中addr的值不再使用default設置的默認值。
2)反序列化時所使用的默認值
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField()
# 注:一旦一個字段設置了default,則這個字段的required默認為False
age = serializers.IntegerField(default=20)
if __name__ == "__main__":
# 準備數據
data = {'name': 'laowang'}
# 數據校驗
serializer = UserSerializer(data=data)
res = serializer.is_valid()
if res:
# 獲取校驗通過之后的數據
print('校驗通過:', serializer.validated_data)
else:
# 獲取校驗失敗之后的錯誤提示信息
print('校驗失?。?#39;, serializer.errors)
示例結果:
結果說明:
上面的age字段設置了一個默認值,校驗的data字典中未傳遞age數據,所以校驗之后的數據中age使用了設置的默認值。
小提示:如果反序列化時傳遞的data中包含age,則校驗之后的字典中age的值不再使用default設置的默認值。
3.2 常用選項參數
常用的選項參數有如下幾個參數:
小提示:以下4個參數都是只在數據校驗時起作用。
參數名稱 | 作用 |
max_length | 字符串最大長度 |
min_length | 字符串最小長度 |
max_value | 數字最大值 |
min_value | 數字最小值 |
參數說明:
·max_length和min_length是針對字符串類型的參數;
·max_value和min_value是針對數字類型的參數。
示例1:max_length和min_length
示例結果:
from rest_framework import serializers
class User(object):
"""用戶類"""
def __init__(self, name, age):
self.name = name
self.age = age
class UserSerializer(serializers.Serializer):
"""序列化器類"""
name = serializers.CharField(min_length=6, max_length=20)
# 此處age字段的required參數默認為True
age = serializers.IntegerField()
if __name__ == "__main__":
# 準備數據
data = {'name': 'smart'}
# 數據校驗
serializer = UserSerializer(data=data)
res = serializer.is_valid()
if res:
# 獲取校驗通過之后的數據
print('校驗通過:', serializer.validated_data)
else:
# 獲取校驗失敗之后的錯誤提示信息
print('校驗失?。?#39;, serializer.errors)
結果說明:
上面的name字段設置了min_length=6和max_length=20兩個參數,在進行數據校驗時,會要求name的長度在6-20之間,因為我們傳遞的"smart"長度為5,所以校驗失敗。
4. 內容總結
本次文章我們講解了以下內容,大家注意結合示例代碼來加強對一些常見的選項參數的理解,下次我們來詳細講解一下序列化器的序列化功能。
1)常見的字段類型
2)通用選項參數
3)常用選項參數
猜你喜歡: