這一節(jié)我們聊聊?rest_framework 序列化器的字段和參數(shù)的一些問題,所有的序列化字段都繼承?rest_framework.fields 模塊,其中最基礎(chǔ)的就是?Field 類,首先我們聊聊該類的參數(shù)和一些基本方法的作用:
1:Field?核心參數(shù)
(1)read_only
????????只讀字段,表示只支持序列化,只在API輸出中 ;而不能反序列化(設(shè)置True),即在創(chuàng)建或更新操作期間不應(yīng)包含在輸入中,如果將該字段包含在序列化器輸入中所有read_only字段都將被忽略,不會保存到數(shù)據(jù)庫里。?
? ? ? ? 默認值為False,請注意:不能同時設(shè)置write_only=True,在序列化時,所有非? ? ? ? ? ? ? ? ? ? write_only=True 的字段都會被輸出;也不能同時設(shè)置required=True。此外,如果一個模型對象沒有某個字段,那么你在序列化器中寫了該字段(必須置:read_only=True),在序列化時不會輸出。
(2)write_only
????????進行設(shè)置True以確保在更新或創(chuàng)建實例時可以使用該字段,但在序列化表示形式時不包括該字段。
? ? ? ? 請注意:不能同時設(shè)置read_only=True ,在反序列化時,所有非?read_only=True? d\的字段都會被保存到數(shù)據(jù)庫中
(3)required
? ? ? ? 在序列化時,required無論是False或True,都沒有影響。
? ? ? ? 在反序列化時,如果設(shè)置False,如果不包含該字段,字段對應(yīng)的模型字段寫入數(shù)據(jù)庫時,采用模型字段的默認值;如果包含該字段,那么以實際填入該字段的值寫入數(shù)據(jù)庫;如果設(shè)置True,不包含該字段時,序列化器在 is_valid 時會驗證錯誤。
? ???????默認值True,請注意:設(shè)置True時, 不能與default參數(shù)同時使用。
(4)allow_null
? ? ? ? 默認值為False。
? ? ? ? 如果將None值賦值給該字段,通常會引發(fā)錯誤。將此關(guān)鍵字參數(shù)設(shè)置為True,None被視為有效值。
(5)default
? ??????如果設(shè)置:則給出默認值,如果沒有提供輸入值,該默認值將用于該字段。如果未設(shè)置:則默認行為是根本不填充該屬性。該default過程中部分更新操作不適用。在部分更新的情況下,僅傳入數(shù)據(jù)中提供的字段將返回經(jīng)過驗證的值。?
? ??????可以設(shè)置為一個callable可調(diào)用對象,無需參數(shù);在這種情況下,每次使用該值時都會對其求值。如果callable具有set_context方法,則每次在將字段實例作為唯一參數(shù)獲取值之前都會被調(diào)用。這與驗證器的工作方式相同。
? ? ? ? 注意:該字段不是必須的,并且不能與字段required=True時一起使用。
(6)source?
????????默認為字段名稱
? ? ? ??將用于填充字段的屬性的名稱??梢允莾H接受self參數(shù)的方法,例如URL(source='get_absolute_url'), 也可以使用點分符號遍歷屬性,例如 EmailField(source='user.email')。
????????該值source='*'具有特殊含義,用于指示應(yīng)將整個對象傳遞給該字段。這對于創(chuàng)建嵌套表示或?qū)τ谛枰L問完整對象才能確定輸出表示的字段很有用。
(7)help_text
????????可用作在HTML表單字段或其他描述性元素中對該字段進行描述的文本字符串。
(8)validators
????????驗證器功能列表,應(yīng)將其應(yīng)用于輸入字段輸入,并引發(fā)驗證錯誤或簡單地返回。驗證器函數(shù)通常應(yīng)該提高serializers.ValidationError,但是ValidationError還支持Django的內(nèi)置函數(shù),以便與Django代碼庫或第三方Django軟件包中定義的驗證器兼容。
(9)error_messages
????????錯誤代碼到錯誤消息的字典。
(10)initial、style、label
? ? ? ? 與前端html或渲染有關(guān),暫時不說明
2:BooleanField(Field)
? ? 對應(yīng)django.db.models.fields.BooleanField 字段。
? ? 為True值:['t', 'T', 'y', 'Y', 'yes', 'YES', 'true', 'True', 'TRUE', 'on', 'On', 'ON', '1', 1, True]
? ? 為False值:['f', 'F','n', 'N', 'no', 'NO','false', 'False', 'FALSE','off', 'Off', 'OFF','0', 0, 0.0, False]
? ? 為None值:['null', 'Null', 'NULL', '', None]
3:?NullBooleanField(BooleanField)
????對應(yīng)django.db.models.fields.NullBooleanField 字段。
4:CharField(Field)
? ? 對應(yīng)django.db.models.fields.CharField、django.db.models.fields.CommaSeparatedIntegerField、django.db.models.fields.TextField 三個字段。
? ? 參數(shù)說明(可選):
max_length: 驗證輸入的字符數(shù)最大數(shù)量。
min_length:驗證輸入的字符數(shù)最小數(shù)量。
allow_blank:? 如果設(shè)置為True,則應(yīng)將空字符串視為有效值。如果設(shè)置為,F(xiàn)alse則認為空字符串無效,并將引發(fā)驗證錯誤。默認為False。
trim_whitespace :如果設(shè)置為,True則修剪前后的空白。默認為True。
5:EmailField(CharField)
? ??對應(yīng)django.db.models.fields.EmailField 字段,表示文本形式,將文本驗證為有效的電子郵件地址。
6:RegexField(CharField)
? ? 對應(yīng)django.forms.fields.RegexField 字段,表示正則文本,用于驗證給定值是否與某個正則表達式匹配。
????參數(shù):
regex:可以是字符串,也可以是已編譯的python正則表達式對象。使用Django的django.core.validators.RegexValidator 作為驗證器。
7:SlugField(CharField)
? ??對應(yīng)django.db.models.fields.SlugField 字段,表示驗證輸入滿足表達式[a-zA-Z0-9_-]+的RegexField字段。
????參數(shù):
allow_unicode:使用Django的django.core.validators.RegexValidator 作為驗證器。 當該參數(shù)有值時,驗證 re.compile(r'^[-\w]+\Z', re.UNICODE) 正則,否則驗證?re.compile(r'^[-a-zA-Z0-9_]+$') 正則。
8:URLField(CharField)
????對應(yīng)?django.db.models.fields.URLField 字段。表示驗證輸入滿足URL格式的RegexField字段。要求使用以下格式的完全限定網(wǎng)址http://<host>/<path>。使用Django的?django.core.validators.URLValidator進行驗證。
9:UUIDField(Field)
? ? 對應(yīng)?django.db.models.fields.UUIDField?字段。表示確保輸入為有效UUID字符串的字段。該to_internal_value 方法將返回一個uuid.UUID實例。在輸出時,該字段將返回標準連字符格式的字符串,例如:de305d54-75b4-431b-adb2-eb6b9e546013。
????format 參數(shù)(可選),其值有:
'hex_verbose':規(guī)范的十六進制表示形式,包括連字符:?"5ce0e9a5-5ffa-654b-cee0-1238041fb31a"
'hex':UUID的緊湊十六進制表示形式,不包括連字符:?"5ce0e9a55ffa654bcee01238041fb31a"
'int':UUID的128位整數(shù)表示:?"123456789012312313134124512351145145114"
'urn':UUID的RFC 4122 URN表示形式:?"urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a"?
更改format參數(shù)僅影響表示形式值。 所有格式均被to_internal_value接受。?
10:IPAddressField(CharField)
? ? 對應(yīng)?對應(yīng)于?django.forms.fields.IPAddressField?和?django.forms.fields.GenericIPAddressField 字段。表示輸入為有效IPv4或IPv6字符串的字段。
? ??參數(shù)(可選):
protocol:將有效輸入限制為指定的協(xié)議。接受的值是“兩個”(默認),“ IPv4”或“ IPv6”。匹配不區(qū)分大小寫。
11:IntegerField(Field)
? ??對應(yīng) django.db.models.fields.IntegerField、AutoField、BigIntegerField、PositiveIntegerField、PositiveSmallIntegerField、SmallIntegerField 字段。表示整數(shù)。
? ??參數(shù)(可選):
max_value:最大值
min_value:最小值
12:FloatField(Field)
? ? 對應(yīng)?django.db.models.fields.FloatField 字段。表示浮點數(shù)。
????參數(shù)(可選):與11相同。
13:DecimalField(Field)
? ??對應(yīng) django.db.models.fields.DecimalField 字段。表示十進制形式,在Python中由Decimal實例表示。
????參數(shù):
max_digits:必選,數(shù)字中允許的最大位數(shù)。它必須是None或大于等于 decimal_places的整數(shù) 。
decimal_places:必選,小數(shù)位數(shù)。
coerce_to_string:如果表示形式應(yīng)該返回字符串值就設(shè)置為True, 或者應(yīng)該返回Decimal對象的話就設(shè)置為?False。除非覆蓋,否則默認為設(shè)置中COERCE_DECIMAL_TO_STRING設(shè)置鍵相同值的True值。 如果Decimal對象由序列化程序返回,則最終輸出格式將由渲染器確定。請注意,設(shè)置localize會將值強制設(shè)為True。?
max_value:最大值
min_value:最小值
localize:設(shè)置為True啟用以基于當前語言環(huán)境本地化輸入和輸出。這也將迫使coerce_to_string到True。默認為False。請注意,如果你USE_L10N=True在設(shè)置文件中進行了設(shè)置,則會啟用數(shù)據(jù)格式設(shè)置。
14:DateTimeField(Field)
????對應(yīng)?django.db.models.fields.DateTimeField 字段。表示日期和時間。
? ? 參數(shù)(可選):
format:輸出格式的字符串。如果未指定,則默認為與api_settings.DATETIME_FORMAT設(shè)置鍵相同的值,其實就是 'iso-8601'。當然也可以指定格式為:%Y-%m-%d %H:%M:%S 等格式。格式字符串可以是顯式指定格式的?Python strftime formats
default_timezone:時區(qū)對象。未指定,默認采用 Dajngo?settings.USE_TZ 設(shè)置的時區(qū)值。
? ? auto_now?and?auto_now_add?model fields
使用ModelSerializer或HyperlinkedModelSerializer,請注意,默認情況下帶有auto_now=True或任何模型字段auto_now_add=True都將使用read_only=True的序列化器字段。
如果要覆蓋此行為,則需要DateTimeField在序列化程序上顯式聲明:
class CommentSerializer(serializers.ModelSerializer):?
? ??created = serializers.DateTimeField()
? ??class Meta:?
? ??????model = Comment???
15:DateField(Field)
? ? 對應(yīng)?django.db.models.fields.DateField 字段。表示日期。參數(shù)與 14 雷同。
16:TimeField(Field)
????對應(yīng) django.db.models.fields.TimeField 字段。表示時間。參數(shù)與 14 雷同。
????TimeField?格式化字符串
格式字符串可以是顯式指定格式的Python strftime 格式,也可以是特殊字符串'iso-8601',它指示應(yīng)使用ISO 8601樣式時間。(例如'12:34:56.000000')
17:DurationField(Field)
????對應(yīng)于?django.db.models.fields.DurationField 字段。表示時間間隔。
????在這些字段的validated_data將包含一個datetime.timedelta實例。該表示形式是遵循此格式的字符串'[DD] [HH:[MM:]]ss[.uuuuuu]'。
? ??注意:?此字段僅適用于Django版本> = 1.8。
18:ChoiceField(Field)
? ??可以接受有限選擇集中的值的字段。
????無論是allow_blank與allow_null上有效的選項ChoiceField,但我們強烈建議您只使用一個,而不是兩個。allow_blank應(yīng)該首選用于文本選擇,并且allow_null應(yīng)該首選用于數(shù)字或其他非文本選擇。
? ? 參數(shù):
choices:必選,有效值列表或(key, display_name)元組列表。
allow_blank:可選,如果設(shè)置為True,則應(yīng)將空字符串視為有效值。如果設(shè)置為,F(xiàn)alse則認為空字符串無效,并將引發(fā)驗證錯誤。默認為False。
html_cutoff:可選, 如果設(shè)置,則將是HTML select下拉列表將顯示的最大選擇數(shù)??梢杂脕泶_保自動生成的ChoiceFields具有非常大的選擇范圍,不會阻止模板的呈現(xiàn)。默認為None。
html_cutoff_text:可選,如果設(shè)置了此選項,則如果在HTML選擇下拉列表中已截斷最大數(shù)量的項目,則它將顯示文本指示器。默認為"More than {count} items…"。
19:MultipleChoiceField(ChoiceField)
????一個可以接受一組零個,一個或多個值的字段,這些值是從一組有限的選擇中選擇的。接受一個強制性參數(shù)。to_internal_value返回set包含所選值的。
? ? 參數(shù):
choices:有效值列表或(key, display_name)元組列表。
allow_blank:如果設(shè)置為True,則應(yīng)將空字符串視為有效值。如果設(shè)置為,F(xiàn)alse則認為空字符串無效,并將引發(fā)驗證錯誤。默認為False。
html_cutoff:如果設(shè)置,則將是HTML select下拉列表將顯示的最大選擇數(shù)??梢杂脕泶_保自動生成的ChoiceFields具有非常大的選擇范圍,不會阻止模板的呈現(xiàn)。默認為None。
html_cutoff_tex: 如果設(shè)置了此選項,則如果在HTML選擇下拉列表中已截斷最大數(shù)量的項目,則它將顯示文本指示器。默認為"More than {count} items…"。
????與ChoiceField一樣,allow_blank和allow_null選項都有效,盡管強烈建議您僅使用一個,而不要同時使用。allow_blank應(yīng)該首選用于文本選擇,并且allow_null應(yīng)該首選用于數(shù)字或其他非文本選擇。
文件上傳字段
????FileField?和?ImageField類是僅適用于使用MultiPartParser或FileUploadParser的。大多數(shù)解析器(例如JSON)不支持文件上傳。Django的常規(guī)FILE_UPLOAD_HANDLERS用于處理上傳的文件。
20:FileField(Field)
????對應(yīng) django.forms.fields.FileField 字段。表示文件。執(zhí)行Django的標準FileField驗證。
? ? 參數(shù)(可選):
max_length:指定文件名的最大長度。
allow_empty_file:指定是否允許空文件。
use_url:如果設(shè)置為True則URL字符串值將用于輸出表示。如果設(shè)置為False則文件名字符串值將用于輸出表示。默認為UPLOADED_FILES_USE_URL設(shè)置鍵的值,除非另有設(shè)置,否則為默認值True。
21:ImageField(FileField)
????對應(yīng)于?django.forms.fields.ImageField 字段。表示圖片。 驗證上傳的文件內(nèi)容是否與已知圖像格式匹配。
? ??需要安裝Pillow包或PIL包。推薦使用Pillow包,因為PIL包已經(jīng)不積極維護。
? ? 參數(shù)(可選):
max_length:指定文件名的最大長度。
allow_empty_file:指定是否允許空文件。
use_url:如果設(shè)置為True則URL字符串值將用于輸出表示。如果設(shè)置為False則文件名字符串值將用于輸出表示。默認為UPLOADED_FILES_USE_URL設(shè)置鍵的值,除非另有設(shè)置,否則為默認值True。
22:ListField(Field)
????????驗證對象列表的字段類。
? ? 參數(shù)(可選):
child: 應(yīng)該用于驗證列表中對象的字段實例。如果未提供此參數(shù),則將不驗證列表中的對象。
allow_empty:是否允許為空
min_length:驗證列表中包含的元素不少于此數(shù)量。
max_length:驗證列表中所包含的元素數(shù)量不超過此數(shù)量。
23:DictField(Field)
????一個驗證對象字典的字段類。?DictField?中的key都總是假定為字符串值。
? ? 參數(shù)(可選):
child: 應(yīng)該用于驗證列表中對象的字段實例。如果未提供此參數(shù),則將不驗證列表中的對象。
allow_empty:是否允許為空
24:JSONField(Field)
????一個字段類,用于驗證傳入的數(shù)據(jù)結(jié)構(gòu)是否包含有效的JSON原語。在其備用二進制模式下,它將表示并驗證JSON編碼的二進制字符串。
? ? 參數(shù)(可選):
binary:如果設(shè)置為True則該字段將輸出并驗證JSON編碼的字符串,而不是原始數(shù)據(jù)結(jié)構(gòu)。默認為False
encoder:json編碼器
decoder:json解碼器
25: ReadOnlyField(Field)
????????一個字段類,僅返回該字段的值而無需修改。
????????ModelSerializer當包含與屬性而不是模型字段相關(guān)的字段名稱時,默認情況下使用此字段。
26:HiddenField(Field)
????????一個字段類,它不基于用戶輸入獲取值,而是從默認值或可調(diào)用對象獲取其值。
27:ModelField(Field)
????????可以綁定到任意模型字段的通用字段。?ModelField類將序列化/反序列化任務(wù)委托給與其關(guān)聯(lián)的model字段。 此字段可用于為自定義模型字段創(chuàng)建序列化程序字段,而不必創(chuàng)建新的自定義序列化程序字段。
????????該字段用于ModelSerializer對應(yīng)于自定義模型字段類。
28:SerializerMethodField(Field)
????????這是一個只讀字段。它通過在附加的序列化器類上調(diào)用一個方法來獲取其值。它可以用于將任何類型的數(shù)據(jù)添加到對象的序列化表示中。
? ? 參數(shù)(可選):
method_name: 要調(diào)用的序列化程序上的方法的名稱。如果未包括,則需要在序列化器中寫上 get_<field_name> 方法
????method_name參數(shù)引用的序列化程序方法應(yīng)接受單個參數(shù)(除了之外self),該參數(shù)是要序列化的對象。它應(yīng)該返回要包含在對象的序列化表示中的任何內(nèi)容。