上一篇說了使用Django傳統寫CRUD的痛點,那麼現在就說解決這些痛點的方法
Django REST framework
- 簡稱爲DRF框架或者REST freamwork框架
- 是在Django框架的基礎上,進行二次開發的
- 適用於構建符合RESTful風格的API
一、特性
- 提供了強大的Serializer序列化器,可以高效地進行序列化與反序列化操作
- 提供了豐富的類視圖、Mixin擴展類、ViewSet視圖集
- 強大的排序,過濾,分頁,搜索,限流等功能
- 多種身份權限認證
= 可擴展性,插件豐富 - 提供了直觀的Web API界面
二、序列化器
數據校驗
- 判斷用戶輸入的數據是否異常
數據轉換
-
反序列化
前端傳入的數據格式(json,xml,text)=>程序中的數據類型 -
序列化
程序中的數據類型->數據格式(前端可以處理的數據,如json,xml,text)
三、序列化:
單個結果的查詢集
修改上一篇的代碼_根據id查詢User信息
1.安裝
pip install djangorestframework
2.配置
settings.py
的INSTALLED_APPS
中,添加rest_framework
'rest_framework'
3.查詢單個結果的結果,使用ID獲取項目:
3.1.創建項目序列化器類:
需要序列化輸出哪些字段,那麼就在序列化器中定義這些字段
新建projects/serializer.py
文件:
from rest_framework import serializers
class ProjectsSerializer(serializers.Serializer):
"""
創建項目序列化器類:需繼承Serializer類或其子類
"""
# 和model類的字段進行對比;注意:max_length的位置需注意,並且有些類型是沒有這個字段的
# label:相當於verbose_name
# help_text:相當於幫助信息
# max_length:最大長度
# !!下面兩個是配對的
# allow_null:相當於null(指定字段非必填,否則是必填)
# allow_blank:相當於blank(指定字段非必填,否則是必填)
#和model中字段可以不一致,需要用就顯示哪些
name = serializers.CharField(label='用戶名', max_length=128, help_text='用戶名' )
leader = serializers.CharField(label="負責人", max_length=50, help_text="負責人")
tester = serializers.CharField(label="測試人員", max_length=50, help_text="測試人員")
programer = serializers.CharField(label="開發人員", max_length=50, help_text="開發人員")
publish_app = serializers.CharField(label="發佈應用", max_length=50, help_text="發佈應用")
desc = serializers.CharField(label="簡要描述", max_length=200, help_text="簡要描述")
3.2、在view
的接口中使用序列化器
步驟:
- a.傳遞查詢集給序列化器的
instance
參數,獲得序列化器對象 - b.從序列化對象的
data
獲取序列化後的dict
類型的數據
例子:修改projects/views.py
中根據id
查詢project
信息的接口
def get(self,request,pk):
project = Projects.objects.get(id=pk)
# 1.傳遞查詢集給序列化器,並返回序列化器對象
serializer = ProjectsSerializer(instance=project)
# 2.通過序列化器對象的data屬性,獲取序列化後的dict
return JsonResponse(serializer.data)
3.3.訪問http://127.0.0.1:8886/users/9
4.多個結果的查詢集
獲取項目列表:
步驟和之前一樣,只不過因爲需要序列化的內容中包含多個結果的查詢集,所以在傳遞查詢集給序列化器處理的時候,需要定義many=True
def get(self,request):
#1>從數據庫獲取所有項目信息,列表格式
projects_qs = Projects.objects.all()
# 查詢集中有多個結果,需要定義many=True
serializer = ProjectsSerializer(instance=projects_qs,many=True)
#JsonResponse第一個參數只能默認爲dict字典,如果未其餘類型需要修改safe=False
return JsonResponse(serializer.data,safe=False)