首先需要明白序列化和反序列化的定義及作用:
序列化是將程序語言轉換為JSON/XML; 反序列化是將JSON/XML轉換為程序語言;
對應到Django中,序列化即把模型對象轉換為字典形式, 在返回給前端,主要用於輸出, 反序列化是將接受前端的字典類型數據,通過驗證再轉換
為模型對象.
序列化器的作用:
-
- 進行數據的校驗
- 對數據對象進行轉換
環境安裝與配置
DRF需要以下依賴:
- Python (2.7, 3.2, 3.3, 3.4, 3.5, 3.6)
- Django (1.10, 1.11, 2.0)
DRF是以Django擴展應用的方式提供的.(若沒有Django環境,需要先創建環境安裝Django)
1. 安裝DRF
pip install djangorestframework
2. 添加rest_framework應用
在工程中的settings.py文件的INSTALLED_APPS中添加'rest_framework'。
INSTALLED_APPS = [ ... 'rest_framework', ]
定義Serializer
1. 定義方法
Django REST framework中的Serializer使用類來定義,須繼承自rest_framework.serializers.Serializer。
例如創建以下序列化器, 具體的字段類型及選項參數如下:
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 = serializers.IntegerField(label='評論量', required=False) image = serializers.ImageField(label='圖片', required=False)
2. 字段與選項
常用字段類型:
字段 | 字段構造方式 |
---|---|
BooleanField | BooleanField() |
NullBooleanField | NullBooleanField() |
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) |
RegexField | RegexField(regex, max_length=None, min_length=None, allow_blank=False) |
SlugField | SlugField(maxlength=50, min_length=None, allow_blank=False) 正則字段,驗證正則模式 [a-zA-Z0-9-]+ |
URLField | URLField(max_length=200, min_length=None, allow_blank=False) |
UUIDField | UUIDField(format='hex_verbose') format: 1) 'hex_verbose' 如"5ce0e9a5-5ffa-654b-cee0-1238041fb31a" 2) 'hex' 如 "5ce0e9a55ffa654bcee01238041fb31a" 3) 'int' - 如: "123456789012312313134124512351145145114" 4) 'urn' 如: "urn:uuid:5ce0e9a5-5ffa-654b-cee0-1238041fb31a" |
IPAddressField | IPAddressField(protocol='both', unpack_ipv4=False, **options) |
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) |
DurationField | DurationField() |
ChoiceField | ChoiceField(choices) choices與Django的用法相同 |
MultipleChoiceField | MultipleChoiceField(choices) |
FileField | FileField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ImageField | ImageField(max_length=None, allow_empty_file=False, use_url=UPLOADED_FILES_USE_URL) |
ListField | ListField(child=<a_field_instance>, min_length=None, max_length=None) |
DictField | DictField(child=<a_field_instance>) |
選項參數:
參數名稱 | 作用 |
---|---|
max_length | 最大長度 |
min_lenght | 最小長度 |
allow_blank | 是否允許為空 |
trim_whitespace | 是否截斷空白字符 |
max_value | 最小值 |
min_value | 最大值 |
通用參數:
參數名稱 | 說明 |
---|---|
read_only | 表明該字段僅用於序列化輸出,默認False |
write_only | 表明該字段僅用於反序列化輸入,默認False |
required | 表明該字段在反序列化時必須輸入,默認True |
default | 反序列化時使用的默認值 |
allow_null | 表明該字段是否允許傳入None,默認False |
validators | 該字段使用的驗證器 |
error_messages | 包含錯誤編號與錯誤信息的字典 |
label | 用於HTML展示API頁面時,顯示的字段名稱 |
help_text | 用於HTML展示API頁面時,顯示的字段幫助提示信息 |
3. 創建Serializer對象
定義好Serializer類后,就可以創建Serializer對象了。
Serializer的構造方法為:
Serializer(instance=None, data=empty, **kwarg)
說明:
1)用於序列化時,將模型類對象傳入instance參數
2)用於反序列化時,將要被反序列化的數據傳入data參數
3)除了instance和data參數外,在構造Serializer對象時,還可通過context參數額外添加數據,如
serializer = AccountSerializer(account, context={'request': request})
通過context參數附加的數據,可以通過Serializer對象的context屬性獲取。