DRF序列化器

序列化器-Serializer

做用: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類後,就能夠建立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屬性獲取。

  1. 使用序列化器的時候必定要注意,序列化器聲明瞭之後,不會自動執行,須要咱們在視圖中進行調用才能夠;
  2. 序列化器沒法直接接收數據,須要咱們在視圖中建立序列化器對象時把使用的數據傳遞過來;
  3. 序列化器的字段聲明相似於咱們前面使用過的表單系統;
  4. 開發restful api時,序列化器會幫咱們把模型數據轉換成字典;
  5. drf提供的視圖會幫咱們把字典轉換成json,或者把客戶端發送過來的數據轉換字典。
相關文章
相關標籤/搜索