序列化器的理解
其實就是Django RESTful Framework
RESTful一種API的命名風格,主要因為前後端分離開發出現
前後端分離: 使用者訪問靜態檔案的伺服器,資料全部由ajax請求給到
RESTful風格:資料應該是名詞,而動詞由HTTP的請求方式來體現
RESTful風格的API給前端返回 結果物件,無論什麼請求方式
”’ 特點: 反覆重複
因為不論什麼請求方式,都需要給前端返回物件內容,就是json格式的
所以每次如果有查詢的結果物件都需要遍歷成字典,和flask相同
如果不是get請求是帶有內容的請求,那從前端接收的是json格式
每次都需要從request.body中拿出內容,是bytes格式
然後decode解碼成json字串然後再loads成可以給python處理的字典
”’
”’
說明:
return JsonResponse(book_list, safe=False)
對safe的說明,我們傳過去的book_list是一個list格式
在前端json支援{}格式也支援[]格式
但是django中認為[]的json格式是不安全的會進行校驗
所以把safe選項關閉False,不進行校驗就可以傳[]
”’
”’
序列化:對查詢結果進行遍歷,然後轉成字典,給到JsonResponse
反序列化:接收前端json處理成字典,然後校驗
”’
”’
1.DRF框架工程搭建,建立在django的基礎上
安裝DRF: pip install djangorestframework
註冊DRF: INSTALLED_APPS = [‘rest_framework’,]
在子應用中serializers.py建立序列化器,用於執行序列化和反序列化
在views中類檢視使用序列化器,在urls中寫地址
”’
”’
2.序列化器: serializer
定義: 其實ModelSerializer是Serializer的子類,更方便有模型類的序列化器的建立,實際產生的序列化器如下
class BookInfoSerializer(serializers.Serializer): 實際繼承Serializer
“”“圖書資料序列化器”“” 序列化器:執行序列化和反序列化
id = serializers.IntegerField(label=’ID’, read_only=True) read_only:只在輸出響應中使用,就是給前端的時候,而前端給我們傳請求的時候,不做驗證
btitle = serializers.CharField(label=’名稱’, max_length=20)
bpub_date = serializers.DateField(label=’釋出日期’, required=False)
bread = serializers.IntegerField(label=’閱讀量’, required=False)
bcomment = serializers.IntegerField(label=’評論量’, required=False)
image = serializers.ImageField(label=’圖片’, required=False)
欄位 : 跟模型類建立很相似,具體存在的欄位見講義 還有常用的引數(就是約束)
使用: 建立物件 serializer = Serializer(instance=None, data=empty, **kwarg)
說明: 序列化時,將模型類物件傳入instance引數 instance = 序列化物件
反序列化時,將要被反序列化的資料傳入data引數 data = 反序列化物件
可通過context引數額外新增資料 即 **kwarg : context={‘request’: request} 通過Serializer物件的context屬性獲取
”’
”’
3.序列化操作 : 其實就是查詢到物件之後,遍歷構造字典的過程,而JsonResponse由內建的 Renderer渲染器來執行
3-1.序列化只使用序列化器物件的第一個引數instance
serializer = BookInfoSerializer(instance = book)
通過data屬性可以獲取序列化後的資料,這個data跟第二個引數可不是一個
serializer.data
3-2.如果要被序列化的是包含多條資料的查詢集QuerySet,新增many=True引數
book_qs = BookInfo.objects.all()
serializer = BookInfoSerializer(book_qs, many=True)
serializer.data
”’
”’
4.關聯物件巢狀序列化(由hero->book通過 hbook方法)
4-1.hbook是個外來鍵: PrimaryKeyRelatedField
hbook = serializers.PrimaryKeyRelatedField(label=’圖書’, read_only=True)
因為是外來鍵,第二個位置必須有read_only=True 或者 查詢集 queryset=BookInfo.objects.all() 要不報錯
serializer.data 序列化的時候 結果是 關聯物件的主鍵 {‘hbook’: 2} 即 book.id
4-2.因為id不直觀,想要詳細內容的字串,把外來鍵欄位改為 : StringRelatedField
hbook = serializers.StringRelatedField(label=’圖書’)
結果: {‘hbook’: ‘天龍八部’}
4-3.介面連結: HyperlinkedRelatedField
hbook = serializers.HyperlinkedRelatedField(label=’圖書’, read_only=True, view_name=’books-detail’)
必須指明view_name引數,以便DRF根據檢視名稱尋找路由,進而拼接成完整URL 這個view_name傳什麼:url中有1個引數,是名稱空間,是跟它關聯
結果: {‘hbook’: ‘ofollow,noindex" target="_blank">http://127.0.0.1:8000/books/2/ ‘}
4-4.關聯物件的指定欄位資料 : SlugRelatedField
hbook = serializers.SlugRelatedField(label=’圖書’, read_only=True, slug_field=’bpub_date’)
slug_field指明使用關聯物件的哪個欄位
結果:{‘hbook’: datetime.date(1986, 7, 24)}
4-5.使用關聯物件的序列化器: 直接把所屬book的所有內容序列化
hbook = BookInfoSerializer()
結果:{‘hbook’: OrderedDict([(‘id’, 2), (‘btitle’, ‘天龍八部’)te’, ‘1986-07-24’), (‘bread’, 36), (‘bcomment’, 40), (‘image’, None)])}