Rest Framework 序列化器(serializer)

什麼是序列化器

	序列化器允許把像查詢集和模型實例這樣的複雜數據轉換爲可以輕鬆渲染成JSON,XML或其他內容類型的原生Python類型。序列化器還提供反序列化,在驗證傳入的數據之後允許解析數據轉換回複雜類型。

REST framework中的serializers與Django的Form和ModelForm類非常像。我們提供了一個Serializer類,它爲你提供了強大的通用方法來控制響應的輸出,以及一個ModelSerializer類,它爲創建用於處理模型實例和查詢集的序列化程序提供了有用的快捷實現方式。

聲明序列化器(serializer)

我們聲明一個序列化器(serializer),我們可以使用它來序列化和反序列化
聲明一個序列化器看起來非常像聲明一個form

Django REST framework中的Serializer使用類來定義,須繼承自rest_framework.serializers.Serializer。
例如,我們已有了一個數據庫模型類BookInfo
class BookInfo(models.Model):
btitle = models.CharField(max_length=20, verbose_name=‘名稱’)
bpub_date = models.DateField(verbose_name=‘發佈日期’, null=True)
bread = models.IntegerField(default=0, verbose_name=‘閱讀量’)
bcomment = models.IntegerField(default=0, verbose_name=‘評論量’)
image = models.ImageField(upload_to=‘booktest’, verbose_name=‘圖片’, null=True)
我們想爲這個模型類提供一個序列化器,可以定義如下:
class BookInfoSerializer(serializers.Serializer):
“”“圖書數據序列化器”""
id = serializers.IntegerField(label=‘ID’, read_only=True)
btitle = serializers.CharField(label=‘名稱’, max_length=20)
bpub_date = serializers.DateField(label=‘發佈日期’, required=False)
bread = serializers.IntegerField(label=‘閱讀量’, required=False)
bcomment_count = serializers.IntegerField(label=‘評論量’, required=False)
image = serializers.ImageField(label=‘圖片’, required=False)

注意:serializer不是隻能爲數據庫模型類定義,也可以爲非數據庫模型類的數據定義。serializer是獨立於數據庫之外的存在。

參數:

max_length

最大長度

min_lenght

最小長度

allow_blank

是否允許爲空

trim_whitespace

是否截斷空白字符

max_value

最小值

min_value

最大值

read_only

將其設置True爲確保在序列化表示時使用該字段,但在反序列化期間創建或更新實例時不使用該字段。,默認False

write_only

將其設置True爲確保在更新或創建實例時可以使用該字段,但在序列化表示時不包括該字段。,默認False

required

  通常,如果在反序列化期間未提供字段,則會引發錯誤。如果在反序列化期間不需要此字段,則設置爲false。

將此設置爲False還允許在序列化實例時從輸出中省略對象屬性或字典鍵。如果密鑰不存在,它將不會包含在輸出表示中,默認True

default

如果設置,則給出默認值,如果未提供輸入值,將使用該字段。如果未設置,則默認行爲是根本不填充該屬性。

該default過程中部分更新操作不適用。在部分更新的情況下,只有傳入數據中提供的字段將返回一個驗證值。

可以設置爲函數或其他可調用函數,在這種情況下,將在每次使用時評估該值。調用時,它不會收到任何參數。如果callable有一個set_context方法,那麼每次在獲取值之前都會調用該方法,並將字段實例作爲唯一參數。這與驗證器的工作方式相同。

請注意,設置default值意味着不需要該字段。包含default和required關鍵字參數都是無效的,並且會引發錯誤。

allow_null

通常,如果None傳遞給序列化程序字段,則會引發錯誤。將此關鍵字參數設置爲Trueif None應被視爲有效值。,默認False

validators

應該應用於傳入字段輸入的驗證程序函數列表,它會引發驗證錯誤或只是返回。驗證器函數通常應該提高serializers.ValidationError,但是Django的內置函數ValidationError也支持與Django代碼庫或第三方Django軟件包中定義的驗證器兼容。

source

將用於填充字段的屬性的名稱。可能是一個只接受self參數的方法,例如URLField(source=‘get_absolute_url’),或者可以使用點分表示來遍歷屬性,例如EmailField(source=‘user.email’)。

該值source=’*'具有特殊含義,用於指示整個對象應該傳遞到該字段。這對於創建嵌套表示或者需要訪問整個對象以確定輸出表示的字段非常有用。

默認爲字段的名稱。

error_messages

錯誤消息的錯誤代碼字典。

label

一個簡短的文本字符串,可用作HTML表單字段或其他描述性元素中字段的名稱。

help_text

一個文本字符串,可用作HTML表單字段或其他描述性元素中字段的描述。

initial

應該用於預先填充HTML表單字段值的值。你可以將一個callable傳遞給它,就像你對任何常規Django一樣Field
例如:
import datetime
from rest_framework import serializers
class ExampleSerializer(serializers.Serializer):
day = serializers.DateField(initial=datetime.date.today)

style

鍵值對的字典,可用於控制渲染器應如何渲染字段。
例如:
password = serializers.CharField(
style={‘input_type’: ‘password’}
)

	Use a radio input instead of a select input.
	
	color_channel = serializers.ChoiceField(
	    choices=['red', 'green', 'blue'],
	    style={'base_template': 'radio.html'}
	)

常用字段

BooleanField

布爾

使用HTML編碼表單輸入時,請注意省略值將始終被視爲將字段設置爲False,即使它已default=True指定選項。這是因爲HTML複選框輸入通過省略值來表示未檢查狀態,因此REST框架將省略視爲空複選框輸入。

CharField

字符串字段
文本表示。(可選)驗證文本是否短於max_length和長於min_length。

EmailField

文本表示,將文本驗證爲有效的電子郵件地址。

RegexField

驗證給定值的文本表示與某個正則表達式匹配。

對應於django.forms.fields.RegexField。

RegexField(regex, max_length=None, min_length=None, allow_blank=False)

強制regex參數可以是字符串,也可以是編譯的python正則表達式對象。

URLField

A RegexField根據URL匹配模式驗證輸入。預計表單的完全限定URL

URLField(max_length=200, min_length=None, allow_blank=False)

IntegerField

整數表示。

IntegerField(max_value=None, min_value=None)

max_value 驗證提供的數字是否不大於此值。
min_value 驗證提供的數字是否不低於此值。

~~

FloatField

浮點表示
FloatField(max_value=None, min_value=None)

max_value 驗證提供的數字是否不大於此值。
min_value 驗證提供的數字是否不低於此值。

DecimalField

一個十進制表示

DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=None, min_value=None)

max_digits數字中允許的最大位數。它必須是None或大於或等於的整數decimal_places。
decimal_places 與數字一起存儲的小數位數。
coerce_to_string設置爲True是否應爲表示返回字符串值,或者False是否Decimal應返回對象。默認值與COERCE_DECIMAL_TO_STRING設置鍵的值相同,True除非被覆蓋。如果Decimal序列化程序返回了對象,則最終輸出格式將由渲染器確定。請注意,設置localize將強制該值True。
max_value 驗證提供的數字是否不大於此值。
min_value 驗證提供的數字是否不低於此值。
localize設置爲True根據當前區域設置啓用輸入和輸出的本地化。這也將迫使coerce_to_string到True。默認爲False。請注意,如果已USE_L10N=True在設置文件中進行了設置,則會啓用數據格式設置。

DateTimeField字段

日期和時間表示

DateTimeField(format=api_settings.DATETIME_FORMAT, input_formats=None)

format - 表示輸出格式的字符串。如果未指定,則默認爲與DATETIME_FORMAT設置鍵相同的值,'iso-8601’除非設置,否則將設置該值。設置爲格式字符串表示to_representation應將返回值強制轉換爲字符串輸出。格式字符串如下所述。設置此值以None指示datetime應返回Python 對象to_representation。在這種情況下,日期時間編碼將由渲染器確定。
input_formats - 表示可用於解析日期的輸入格式的字符串列表。如果未指定,DATETIME_INPUT_FORMATS將使用默認設置[‘iso-8601’]。

ChoiceField

可以接受有限選擇集中的值的字段。

ModelSerializer如果相應的模型字段包含choices=…參數,則用於自動生成字段。
gender = models.CharField(choices=((‘0’,‘man’),(‘1’,‘women’)),max_length=1)

FileField

文件表示。執行Django的標準FileField驗證。
FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
max_length - 指定文件名的最大長度
allow_empty_file - 指定是否允許空文件。
use_url- 如果設置爲,True則URL字符串值將用於輸出表示。如果設置爲False則文件名字符串值將用於輸出表示。默認爲UPLOADED_FILES_USE_URL設置鍵的值,True除非另有設置。

ImageField

圖像表示。將上載的文件內容驗證爲與已知圖像格式匹配。
ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL)
max_length - 指定文件名的最大長度。
allow_empty_file - 指定是否允許空文件。
use_url- 如果設置爲,True則URL字符串值將用於輸出表示。如果設置爲False則文件名字符串值將用於輸出表示。默認爲UPLOADED_FILES_USE_URL設置鍵的值,True除非另有設置。
需要Pillow包裝或PIL包裝。Pillow建議使用該包,因爲PIL不再主動維護

創建Serializer對象

定義好Serializer類後,就可以創建Serializer對象了。
Serializer的構造方法爲:
Serializer(instance=None, data=empty, **kwarg)
說明:
用於序列化時,將模型類對象傳入instance參數
用於反序列化時,將要被反序列化的數據傳入data參數
除了instance和data參數外,在構造Serializer對象時,還可通過context參數額外添加數據,如
serializer = AccountSerializer(account, context={‘request’: request})
通過context參數附加的數據,可以通過Serializer對象的context屬性獲取。

序列化
模型類對象 —> python字典 用於輸出 返回給前端時使用
class BookInfoForFrontendSerializer(serializers.Serializer):
“”“圖書數據序列化器”""
id = serializers.IntegerField(label=‘ID’, read_only=True)
btitle = serializers.CharField(label=‘名稱’, max_length=20)
bpub_date = serializers.DateField(label=‘發佈日期’, required=False)
bread = serializers.IntegerField(label=‘閱讀量’, required=False)
bcomment_count = serializers.IntegerField(label=‘評論量’, required=False)
image = serializers.ImageField(label=‘圖片’, required=False)
反序列化
前端產送的數據 —> 經過驗證 —> python字典 -> save -> 模型類對象 用於輸入 接收前端數據時使用
class BookInfoSaveSerializer(serializers.Serializer):
“”“圖書數據序列化器”""
btitle = serializers.CharField(label=‘名稱’, max_length=20, write_only=True)
bpub_date = serializers.DateField(label=‘發佈日期’, required=False)
bread = serializers.IntegerField(label=‘閱讀量’, required=False)
bcomment_count = serializers.IntegerField(label=‘評論量’, required=False)
image = serializers.ImageField(label=‘圖片’, required=False)

read_only = True 只在序列化時使用
write_only = True 只在反序列化時使用

參考官方文檔 https://q1mi.github.io/Django-REST-framework-documentation/api-guide/serializers_zh/#_2

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章