序列化組件的三大功能
-
序列化,序列化器會把模型物件轉換成字典,經過response以后變成json字串
-
反序列化,把客戶端發送過來的資料,經過request以后變成字典,序列化器可以把字典轉成模型
-
反序列化時同時會完成資料校驗功能
序列化器Serializer使用方法
查詢單個資料語法:
1.在setting.py中的app配置里注冊一下drf

2.在django的模型層創建一個表
from django.db import models
# Create your models here.
class Book(models.Model):
nid = models.AutoField(primary_key=True)
name = models.CharField(max_length=32)
price = models.DecimalField(max_digits=5, decimal_places=2)
author = models.CharField(max_length=32)
3.在表中添加一些資料
4.撰寫序列化組件(類似forms組件),可以在應用下單獨創一個檔案夾,里面放序列化組件.py
from rest_framework import serializers# 匯入drf中的序列化類
# 創建一個類繼承Serializer序列化類
class BookSerializer(serializers.Serializer):
# 定義需要序列化的欄位,想要哪個欄位就添加該欄位,不需要就注釋掉
nid = serializers.CharField()
name = serializers.CharField()
price = serializers.CharField()
5.在url.py中開設路徑獲取序列化之后的資料
urlpatterns = [
path('admin/', admin.site.urls),
re_path(r'^book/(?P<pk>\d+)/$',views.BooksView.as_view()) #CBV格式的url
]
6.在視圖函式中序列化需要的模型物件,回傳給前端頁面字典格式的資料
from rest_framework.views import APIView # 匯入drf模塊的apiview,使得cbv格式的視圖函式繼承它
from app01 import models
from .ser import BookSerializer # 匯入自己寫好的序列化組件
from rest_framework.response import Response # 匯入drf模塊的回應類
class BooksView(APIView):
# get請求的視圖函式
def get(self,request,pk):
# 得到需要查詢的模型物件
book = models.Book.objects.filter(pk=pk).first()
# 將模型物件交給自己寫好的序列化器,生成一個序列化物件
book_ser = BookSerializer(book)
# book_ser.data 序列化物件.data就是序列化后的字典
return Response(book_ser.data) # 利用drf中的Response類回傳給前端,Response會幫您把這個字典序列化成json格式!
# 使用JsonResponse回傳上述字典,在瀏覽器就沒有Response漂亮的格式而已,也是回傳json資料格式
return JsonResponse(book_ser.data,json_dumps_params={'ensure_ascii':False})
查詢所有語法:
# views.py
class BooksView(APIView):
def get(self,request):
response_msg = {'status': 100, 'msg': '成功'}
books=Book.objects.all()
book_ser=BookSerializer(books,many=True) #序列化多條,如果序列化一條,不需要寫
response_msg['data']=book_ser.data
return Response(response_msg)
#urls.py
path('books/', views.BooksView.as_view()),
修改資料語法
1.在cbv格式的視圖函式中添加put函式
def put(self,request,pk):
back_dic = {'code':1000,'msg':'成功'}
# 1.得到需要查詢的模型物件
book = models.Book.objects.filter(pk=pk).first()
# 2. 將模型物件交給自己寫好的序列化器,生成一個序列化物件,除了傳模型物件,還需要傳入用戶修改的資料
book_ser = BookSerializer(instance=book,data=https://www.cnblogs.com/suncolor/p/request.data)
# 3.進行資料校驗,類似forms組件的校驗
is_right = book_ser.is_valid()
if is_right:
# 4.校驗通過操作序列化物件保存修改資料
book_ser.save() # 注意這里需要在序列化組件中重寫update()方法,否則報錯
# 5.將正確的資料在回傳給前端
back_dic['data'] = book_ser.data
else:
back_dic['code'] = 1001
back_dic['msg'] = '資料格式不正確'
back_dic['data'] = book_ser.errors
return Response(back_dic)
2.在自定義的序列化組件類中添加update()方法
def update(self, instance, validated_data):
# instance引數就是book這個物件,validated_data就是用戶修改提交上來的字典格式資料
# 1.修改這個物件的欄位值
instance.name = validated_data.get('name')
instance.price = validated_data.get('price')
# 2.操作資料庫保存修改資料
instance.save() # 相當于book.save() 是django orm提供的方法
# 最后需要把這個book物件在回傳出去
return instance
新增資料語法
# views.py
class BooksView(APIView):
# 新增
def post(self,request):
response_msg = {'status': 100, 'msg': '成功'}
#修改才有instance,新增沒有instance,只有data
book_ser = BookSerializer(data=https://www.cnblogs.com/suncolor/p/request.data)
# book_ser = BookSerializer(request.data) # 這個按位置傳request.data會給instance,就報錯了
# 校驗欄位
if book_ser.is_valid():
book_ser.save()
response_msg['data']=book_ser.data
else:
response_msg['status']=102
response_msg['msg']='資料校驗失敗'
response_msg['data']=book_ser.errors
return Response(response_msg)
#ser.py 序列化類重寫create方法
def create(self, validated_data):
instance=Book.objects.create(**validated_data)
return instance
# urls.py
path('books/', views.BooksView.as_view()),
洗掉資料語法:
# views.py
class BookView(APIView):
def delete(self,request,pk):
ret=Book.objects.filter(pk=pk).delete()
return Response({'status':100,'msg':'洗掉成功'})
# urls.py
re_path('books/(?P<pk>\d+)', views.BookView.as_view()),
序列化的欄位型別
常用欄位型別
# 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/suncolor/p/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)
需要記住的欄位型別
CharField
BooleanField
IntegerField
DecimalField
ListField
DictField
常用的欄位引數
1 給CharField欄位類使用的引數
max_length 最長長度
min_length 最小長度
allow_blank 是否允許為空
trim_whitespace 是否截斷空白欄位
2 給IntegerField欄位類使用的引數
max_value 最小值
min_value 最大值
3 通用引數,放在哪個欄位類上都可以
required 表明該欄位在反序列化時必須輸入,默認True
default 反序列化時使用的默認值
allow_null 表明該欄位是否允許傳入None,默認False
validators 該欄位使用的驗證器
error_messages 包含錯誤編碼與錯誤資訊的字典
label 用于HTML展示API頁面時,顯示的欄位名稱
help_text 用于Html展示API頁面時,顯示的欄位幫助提示資訊
4 重點
read_only 表明該欄位僅用于序列化輸出,默認False,如果設定成True,postman中可以看到該欄位,修改時,不需要傳該欄位
write_only 表明該欄位僅用于反序列化輸入,默認False,如果設定成True,postman中看不到該欄位,修改時,該欄位需要傳
序列化組件中的鉤子函式和validators校驗
區域鉤子:
# 序列化組件中的鉤子函式
# 區域鉤子函式validate_欄位名的形式,需要傳入一個data引數,data就是price
def validate_price(self, data):
print(type(data)) #格式為<class 'str'>
print(data) # 34.00
# 進行校驗,當價格大于30報錯
if float(data) < 30:
return data
else:
# 校驗不通過,拋出例外 rest_framework例外在 from rest_framework.exceptions import ValidationError里
raise ValidationError('價格太高')
全域鉤子:
def validate(self,validated_data): # validated_data校驗之后的資料
name = validated_data.get('name')
price = validated_data.get('price')
if name == 'zhang' and price == '25':
raise ValidationError('不正確')
return validated_data
第三種validators校驗:
# 定義一個函式
def check_name(data):
if data.startswith('sb'):
raise ValidationError('名字不能是sb開頭')
else:
return data
# 在指定欄位內添加validators
name = serializers.CharField(validators=[check_name]) #validators=[]串列中寫函式的記憶體地址
總結:主要用區域鉤子和validators校驗,全域基本不用!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/514279.html
標籤:Python
上一篇:【python】18行代碼帶你采集國外網小姐姐絕美圖片
下一篇:面向物件編程
