Django-drf-002-序列化器
阿新 • • 發佈:2021-12-15
序列化器
介紹
在Django中,前端傳來的資料,一般是JSON格式的資料,獲取資料需要通過request.POST.get('xxx)的形式拿到資料,對資料操作完後,返回給前端,也需要轉成JSON格式,比較麻煩。
drf中提供了序列化器的功能,解決了這一過程
功能
序列化:把模型物件轉為字典,經過response後轉成JSON字串
反序列化:把客戶端傳來的資料,經過request後轉為字典。並完成資料校驗功能。序列化器可以把字典轉為模型物件。
Serializer
定義一個Serializer型別的序列化器
Serializer型別的序列化器不指定模型表
1 # 新建一個py檔案2 from rest_framework import serializers 3 4 5 class BookSerializer(serializers.Serializer):
# 這裡沒有指定模型表,但是欄位還是要對應 6 # 想序列化哪些欄位,就寫哪些欄位 7 id = serializers.CharField() 8 name = serializers.CharField() 9 price = serializers.CharField() 10 author = serializers.CharField()11 publish = serializers.CharField()
使用Serializer型別的序列化器
過程:通過ORM從資料庫獲取資料物件-->呼叫序列化器,序列化資料-->將序列化的資料返回給前端
在檢視類中使用
1 from rest_framework.views import APIView 2 from api import models 3 from api import ser 4 from rest_framework.response import Response 5 6 7 class BoosView(APIView):8 def get(self,request,pk): 9 # 根據pk拿資料 10 book_queryset = models.Books.objects.filter(id=pk).first() 11 # 呼叫序列化元件,序列化資料 12 book_ser = ser.BookSerializer(book_queryset) 13 # 序列化物件.data就是序列化後的字典 14 return Response(book_ser.data)
常用選項
- max_length
- min_length
- allow_blank:是否允許為空
- trim_whitespace:是否截斷空白字元
-max_value
-min_value
- required:表名該欄位在反序列化時必須輸入,預設True
-default:反序列化時設定預設值
-allow_null:允許傳null,預設False
-validators:該欄位使用的驗證器
- error_message:包含錯誤編號與錯誤資訊的字典
- read_only:表名該欄位僅用於序列化輸出,預設False,若設定為True,在postman中可以看到欄位,修改時,不需要傳給該欄位傳值
- write_only:表名該欄位段僅用於反序列化輸入,預設False,若設定為True,在postman中看不到該欄位,修改時,需要給該欄位傳值
區域性鉤子函式
from rest_framework.exceptions import ValidationError # 區域性鉤子 def validate_price(self, data): # 鉤子的名字規則:valiedate_欄位名,然後接收一個引數 # 如price,價格低於10,校驗失敗 if float(data) > 10: return data # 鉤出來的資料要return else: # 校驗失敗,丟擲異常 raise ValidationError('價格太低')
全域性鉤子函式
# 全域性鉤子 def validate(self,validate_date): author = validate_date.get('author') # 獲取校驗後的資料 publish = validate_date.get('publish') if author == publish: raise ValidationError('作者名字和出版社一樣') else: return validate_date # 鉤出來的資料要return
使用validators校驗
# ser.py 序列化類中寫 def check_author(data): if data.startswith('sb'): raise ValidationError('作者名字不能以sb開頭') else: return data class BookSerializer(serializers.Serializer): # 需要序列化哪些欄位,就寫哪些欄位 author = serializers.CharField(validators=[check_author]) # validators後面可以放函式的記憶體地址,把author對應的資料傳進去做校驗
END.