一、序列化組件介紹
#作用: 1. 序列化,序列化器會把模型物件轉換成字典,經過response以后變成json字串 -Book模型--序列化器--->字典--通過drf:Response--》json格式字串--->傳給前端 2. 反序列化,把客戶端發送過來的資料,經過request以后變成字典,序列化器可以把字典轉成模型 json格式資料---通過drf:Request-->字典---序列化器---》Book模型 3. 反序列化,完成資料校驗功能
二、序列化組件簡單使用
# 序列化的使用 -寫一個序列化類繼承serializers.Serializer -在類中寫要序列化的欄位 -在視圖類中,實體化得到一個序列化類的物件,把要序列化的資料傳入 ser=BookSerializer(instance=res,many=True) -得到字典 ser.data就是序列化后的字典
三、序列化組件使用代碼實作
'''
5個介面 1. 查詢所有 Book--》get 2. 查詢單個 BookDetali--》get 3. 新增一個 Book--》post 4. 洗掉一個 BookDetali--》delete 5. 修改一個 BookDetali--》put '''
1.查詢所有
url:127.0.0.1.8000/books/ # 注意最后面的 /一定要寫
models.py # 建立好模型,進行資料遷移,在資料庫中手動添加至少2條資料
from django.db import models class Book(models.Model): id = models.AutoField(primary_key=True) title = models.CharField(max_length=32,null=True) #測驗read_only price = models.DecimalField(max_digits=5, decimal_places=2) publish = models.CharField(max_length=32)
urls.py #配置好路由
path('books/', views.Book.as_view()),
views.py #寫視圖類
from rest_framework.views import APIView from rest_framework.response import Response from app01 import models from app01.serializer import BookSerializer class Book(APIView): def get(self, request, *args, **kwargs): res = models.Book.objects.all() # 借助序列化器 # 如果是多條,就是many=True # 如果是單個物件,就不寫 ser = BookSerializer(instance=res, many=True) print(type(ser)) # rest_framework.serializers.ListSerializer # 通過序列化器得到的字典 # ser.data print(ser.data) return Response(ser.data)
serializer.py #在app中創建存放序列化器的 類的檔案 serializer.py 并寫BookSerializer類
# 序列化器類(序列化Book表) # from rest_framework.serializers import Serializer from rest_framework import serializers from rest_framework.exceptions import ValidationError from app01 import models class BookSerializer(serializers.Serializer): # 要序列化哪個欄位 id = serializers.IntegerField(required=False) # id=serializers.CharField() title = serializers.CharField(max_length=32,min_length=2,read_only=True) price = serializers.DecimalField(max_digits=5, decimal_places=2) # 序列化的時候看不到,因為write_only=True
publish = serializers.CharField(max_length=32,write_only=True)
2.查詢單個
url:127.0.0.1.8000/books/1 #后面的數字代表查詢id為幾的資料
urls.py中加
re_path('^books/(?P<id>\d+)', views.BookDetail.as_view()),
views.py中加
class BookDetail(APIView): def get(self, request, id): res = models.Book.objects.all().filter(id=id).first() # 單個,去掉many=True # 加many=True和不加,ser不是同一個物件,查單個是BookSerializer物件,查多個是ListSerializer物件,這是由原始碼中元類決定的 ser = BookSerializer(instance=res) print(type(ser)) # 列印出 app01.serializer.BookSerializer return Response(ser.data)
3.新增一個 ---這里涉及到保存!!!
urls.py 不變
views.py
class Book(APIView): def get(self, request, *args, **kwargs): ... def post(self, request): # post提交的資料都在request.data 是個字典 print(request.data) ser = BookSerializer(data=https://www.cnblogs.com/guojieying/p/request.data) if ser.is_valid(): # 校驗資料是否合法 ser.save() # 保存到資料庫中 return Response(ser.data) else: # 沒有校驗通過的錯誤資訊 return Response(ser.errors)
serializer.py
# 如果序列化類繼承的是Serializer,必須重寫create方法 class BookSerializer(serializers.Serializer): ... def create(self, validated_data): # 為什么要重寫create?為了跟views.py里面的Book表建立關系 res=models.Book.objects.create(**validated_data) print(res) return res
四、序列化類欄位型別和欄位引數
# 常用欄位型別 -IntegerField -CharField -DecimalField -DateTimeField -,,,跟models中大差不差 # 常用欄位引數 -選項引數 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 包含錯誤編號與錯誤資訊的字典
五、序列化器的保存功能
同三中3.增加一個 里面的保存
六、序列化器的欄位校驗功能
validators校驗,區域鉤子,全域鉤子
# 三種方式 -欄位自己的校驗規則(max_length...) -validators的校驗 publish = serializers.CharField(max_length=32,validators=[check,]) def check(data): if len(data)>10: raise ValidationError('最長不能超過10') else: return data -區域和全域鉤子 # 區域鉤子,validate_欄位名,需要帶一個data,data就是該欄位的資料 def validate_title(self, data): if data.startswith('sb'): raise ValidationError('不能以sb開頭') else: return data # 全域鉤子 def validate(self, attrs): title=attrs.get('title') publish=attrs.get('publish') if title==publish: raise ValidationError('書名不能跟出版社同名') else: return attrs
七、序列化類常用欄位引數之read_only和write_only
read_only 表明該欄位僅用于序列化輸出,默認False write_only 表明該欄位僅用于反序列化輸入,默認False class BookSerializer(serializers.Serializer): # 要序列化哪個欄位 id = serializers.IntegerField(required=False) # id=serializers.CharField() title = serializers.CharField(max_length=32,min_length=2,read_only=True) price = serializers.DecimalField(max_digits=5, decimal_places=2) # 序列化的時候看不到 publish = serializers.CharField(max_length=32,validators=[check,],write_only=True)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/202823.html
標籤:架構設計
