為什么要使用Rest Framework鸠踪?
Django REST Framework可以在Django的基礎(chǔ)上迅速實(shí)現(xiàn)API俐芯,并且自身還帶有WEB的測試頁面,可以方便的測試自己的API。
Django REST framework 簡介
序列化和反序列化可以復(fù)用
增:效驗(yàn)請求數(shù)據(jù) > 執(zhí)行反序列化過程 > 保存數(shù)據(jù)庫 > 將保存的對象序列化并返回
刪:判斷要刪除的數(shù)據(jù)是否存在 > 執(zhí)行數(shù)據(jù)庫刪除
改:判斷要修改的數(shù)據(jù)是否存在 > 效驗(yàn)請求的參數(shù) > 執(zhí)行反序列化過程 > 保存數(shù)據(jù)庫 > 將保存的對象序列化并返回
查:查詢數(shù)據(jù)庫 > 將數(shù)據(jù)序列化并返回
特點(diǎn):
- 提供了定義序列化器Serializer的方法,可以快速根據(jù)Django ORM 或者其他庫自動序列化/反序列化
- 提供了豐富的類視圖\MIXIN擴(kuò)展類,簡化視圖的編寫
- 豐富的定制層級:函數(shù)視圖\類視圖\試圖結(jié)合到自動生成API,滿足各種需要
- 多種身份認(rèn)證和權(quán)限認(rèn)證方式的支持
- 內(nèi)置了限流系統(tǒng)
- 直觀的API web界面
- 可擴(kuò)展性 , 插件豐富
Django rest framework核心任務(wù)
- 多了個serializer.py文件
這個文件的作用是Serializers
把querysets
和model instances
這些復(fù)雜的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)化為native python
以便以json
搞乏,xml
或其他內(nèi)容類型的形式render
出去。 - 視圖的核心功能變了
- 將數(shù)據(jù)庫數(shù)據(jù)序列化為前端需要的格式并返回戒努;
- 將前端發(fā)送過來的數(shù)據(jù)反序列化為模型類型對象请敦,并保存到數(shù)據(jù)庫中镐躲。
開始Django rest framework旅程
安裝第三方庫
pip install django
pip install djangorestframework
配置
- 在settings.py的app中添加
INSTALLED_APPS = [
'rest_framework', # DRF
]
創(chuàng)建模型類(Model)
# 欄目
class Column(models.Model):
name = models.CharField(max_length=20, unique=True, verbose_name='欄目')
link_url = models.URLField(verbose_name= '鏈接')
index = models.IntegerField(verbose_name='位置')
class Meta: # 模型元選項
db_table = 'tb_column' # 在數(shù)據(jù)庫中的表名,否則Django自動生成為app名字_類名
ordering = ['index']
verbose_name = '欄目'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
創(chuàng)建一個序列化類(Serializer)
在app目錄下新建serializer.py
from rest_framework import serializers
from article.models import Column
class ColumnSerializer(serializers.Serializer):
name = serializers.CharField(max_length=20, label='欄目')
link_url = serializers.URLField(label= '鏈接')
index = serializers.IntegerField(label='位置')
def create(self, validated_data): # create()和update()方法定義了在調(diào)用serializer.save()時成熟的實(shí)例是如何被創(chuàng)建和修改的侍筛。
return Column.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.link_url = validated_data.get('link_url', instance.link_url)
instance.index = validated_data.get('index', instance.index)
instance.save()
return instance
注意
各字段與模型類中的字段是否一致萤皂。
編寫視圖(APIView)
from article.models import Column
from .serializers import ColumnSerializer
from rest_framework.views import APIView
from rest_framework.response import Response
class ColumnView(APIView):
def get(self, request):
# 獲取queryset
columns = Column.objects.all()
# 開始序列化;
serializer_data = ColumnSerializer(columns, many=True)
#print(serializer_data)
# print(serializer_data.data)
# 獲取序列化后的數(shù)據(jù)匣椰,返回給客戶端
return Response(serializer_data.data)
def post(self, request):
# 獲取數(shù)據(jù)
client_data = request.data
# 序列化數(shù)據(jù)
verified_data = ColumnSerializer(data=client_data)
#print(verified_data)
# 校驗(yàn)數(shù)據(jù)
if verified_data.is_valid():
column = verified_data.save()
#print(verified_data.data) # 需要保存之后才能獲取.data
return Response(verified_data.data)
else:
return Response(verified_data.errors, status=400)
def put(self, request, column_id):
column_obj = Column.objects.get(pk=column_id)
verified_data = ColumnSerializer(instance=column_obj , data=request.data)
# 校驗(yàn)數(shù)據(jù)
if verified_data.is_valid():
column = verified_data.save()
#print(verified_data.data) # 需要保存之后才能獲取.data
return Response(verified_data.data)
else:
return Response(verified_data.errors, status=400)
def delete(self, request, column_id):
column_obj = Column.objects.get(pk=column_id)
column_obj.delete()
return Response({'message': 'OK'})
配置URL地址
app_name = 'api'
urlpatterns = [
path('column/', ColumnView.as_view(), name='column'),
]
利用postman測試
get獲取數(shù)據(jù)列表信息
get方法中兩個輸出語句為
post增加數(shù)據(jù):
輸出語句
我們將視圖修改下裆熙,獲取單個數(shù)據(jù)
由以上可以看出API與我們的表單(forms)很相似,除了將模型實(shí)例(model instance)序列化外禽笑,我們也能序列化查詢集(querysets)入录,只需要添加一個序列化參數(shù)many=True。
使用模型序列化ModelSerializers
我們定義的ColumnSerializer類字段和模型字段有很多是重復(fù)的佳镜,為了保證代碼簡潔僚稿,減少重復(fù), 我們可以類似于Django提供表單(Form)類和模型表單(ModelForm)類相同的方式蟀伸,REST framework也提供了Serializer和ModelSerializer贫奠。下面我們重寫ColumnSerializer類。
class ColumnSerializer(serializers.ModelSerializer):
class Meta:
model = Column
fields = ['name', 'link_url', 'index']
測試結(jié)果和使用
注意:要記住 ModelSerializer 不做任何格外的配置望蜡,它只是創(chuàng)建序列化類的快捷方式:
1.根據(jù)model里的字段自動定義字段集
2.簡單的實(shí)現(xiàn) create() and update() 方法唤崭,不像使用還要Serializer,自定義create()和update()方法定義了在調(diào)用serializer.save()實(shí)例是如何被創(chuàng)建和修改的脖律。