做用:python
1. 序列化,序列化器會把模型對象轉換成字典,通過response之後變成json字符串 2. 反序列化,把客戶端發送過來的數據,通過request之後變成字典,序列化器能夠把字典轉成模型 3. 反序列化,完成數據校驗功能
Django REST framework中的Serializer使用類來定義,須繼承自rest_framework.serializers.Serializer。git
首先建立一個子應用sers數據庫
python manage.py startapp sers
使用上一篇博客中建立的數據庫模型類students/Student,代碼以下:django
from django.db import models # Create your models here. class Student(models.Model): # 模型字段 name = models.CharField(max_length=100,verbose_name="姓名",help_text="提示文本:帳號不能爲空!") sex = models.BooleanField(default=True,verbose_name="性別") age = models.IntegerField(verbose_name="年齡") class_null = models.CharField(max_length=5,verbose_name="班級編號") description = models.TextField(verbose_name="個性簽名") class Meta: db_table="tb_student" verbose_name = "學生" verbose_name_plural = verbose_name
若是要爲這個模型類提供一個序列化器,還須要建立一個serializers.py文件,而後進行以下定義:json
from rest_framework import serializers # 聲明序列化器,全部的序列化器都要直接或者間接繼承於 Serializer # 其中,ModelSerializer是Serializer的子類,ModelSerializer在Serializer的基礎上進行了代碼簡化 class StudentSerializer(serializers.Serializer): """學生信息序列化器""" # 1. 須要進行數據轉換的字段 id = serializers.IntegerField() name = serializers.CharField() age = serializers.IntegerField() sex = serializers.BooleanField() description = serializers.CharField() # 2. 若是序列化器集成的是ModelSerializer,則須要聲明調用的模型信息 # 3. 驗證代碼 # 4. 編寫添加和更新模型的代碼
【注意】serializer不是隻能爲數據庫模型類定義,也能夠爲非數據庫模型類的數據定義。能夠說serializer是獨立於數據庫以外的存在。api
字段 | 字段構造方式 serializers.字段構造方式() |
---|---|
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(max*length=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=, min_length=None, max_length=None) |
DictField | DictField(child=) |
參數名稱 | 做用 |
---|---|
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頁面時,顯示的字段幫助提示信息 |
定義好Serializer類後,就能夠建立Serializer對象了。對象能夠建立在該應用的views.py中:restful
Serializer的構造方法爲:app
Serializer(instance=None, data=empty, **kwarg)
說明:ui
1)用於序列化時,將模型類對象傳入instance參數url
2)用於反序列化時,將要被反序列化的數據傳入data參數
3)除了instance和data參數外,在構造Serializer對象時,還可經過context參數額外添加數據,如
serializer = StudentSerializer(instance, context={'request': request}) # 參數instance ,模型對象,這個參數通常用於把模型轉成字典,進行序列化 # 參數data,客戶端提交的字典數據,這個參數通常用於把字典轉成模型對象,進行校驗數據和反序列化 # 參數context,有時候,路由或者視圖中有些數據須要傳遞序列化器內部的方法中調用,則能夠context以字典的格式傳遞進行 # 額外參數: many=True, 表示instance是一個模型列表,此時序列化器在轉換數據的時候能夠進行循環
經過context參數附加的數據,能夠經過Serializer對象的context屬性獲取。