序列化器-Serializer
作用:
1. 序列化,序列化器會把模型物件轉換成字典,經過response以后變成json字串
2. 反序列化,把客戶端發送過來的資料,經過request以后變成字典,序列化器可以把字典轉成模型
3. 反序列化,完成資料校驗功能
定義序列化器
Django REST framework中的Serializer使用類來定義,須繼承自rest_framework.serializers.Serializer,
首先創建一個子應用sers
python manage.py startapp sers
使用上一篇博客中創建的資料庫模型類students/Student,代碼如下:
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檔案,然后進行如下定義:
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是獨立于資料庫之外的存在,
常用欄位型別
欄位
| 欄位 | 欄位構造方式 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(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=https://www.cnblogs.com/jjzz1234/p/None, min_value=None) |
| FloatField | FloatField(max_value=https://www.cnblogs.com/jjzz1234/p/None, min_value=None) |
| DecimalField | DecimalField(max_digits, decimal_places, coerce_to_string=None, max_value=https://www.cnblogs.com/jjzz1234/p/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中:
Serializer的構造方法為:
Serializer(instance=None, data=https://www.cnblogs.com/jjzz1234/p/empty, **kwarg)
說明:
1)用于序列化時,將模型類物件傳入instance引數
2)用于反序列化時,將要被反序列化的資料傳入data引數
3)除了instance和data引數外,在構造Serializer物件時,還可通過context引數額外添加資料,如
serializer = StudentSerializer(instance, context={'request': request})
# 引數instance ,模型物件,這個引數一般用于把模型轉成字典,進行序列化
# 引數data,客戶端提交的字典資料,這個引數一般用于把字典轉成模型物件,進行校驗資料和反序列化
# 引數context,有時候,路由或者視圖中有些資料需要傳遞序列化器內部的方法中呼叫,則可以context以字典的格式傳遞進行
# 額外引數: many=True, 表示instance是一個模型串列,此時序列化器在轉換資料的時候可以進行回圈
通過context引數附加的資料,可以通過Serializer物件的context屬性獲取,
- 使用序列化器的時候一定要注意,序列化器宣告了以后,不會自動執行,需要我們在視圖中進行呼叫才可以;
- 序列化器無法直接接收資料,需要我們在視圖中創建序列化器物件時把使用的資料傳遞過來;
- 序列化器的欄位宣告類似于我們前面使用過的表單系統;
- 開發restful api時,序列化器會幫我們把模型資料轉換成字典;
- drf提供的視圖會幫我們把字典轉換成json,或者把客戶端發送過來的資料轉換字典,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/55257.html
標籤:其他
