rest_framework框架是基于Django實作的一個RESTful風格的API框架,之前介紹過restful風格,可以參考這篇文章---->傳送門
安裝
pip install djangorestframework
配置
在installed_apps中注冊
INSTALLED_APPS = [
...,
'rest_framework',
]
在setting.py 配置
REST_FRAMEWORK = {
'DEFAULT_RENDERER_CLASSES': ( # 默認回應渲染類
# 'rest_framework.schemas.AutoSchema',
'rest_framework.renderers.JSONRenderer',
'rest_framework.renderers.BrowsableAPIRenderer'
)
}
在app中新建serializers.py檔案和models.py,views.py同級
在里面定義序列化器
class HrefInfoModelSerializer(serializers.ModelSerializer):
class Meta:
model = Href
fields = '__all__'
def create(self, validated_data):
return Href.objects.create(**validated_data)
def update(self, instance, validated_data):
instance.name = validated_data.get('name', instance.name)
instance.url = validated_data.get('url', instance.url)
instance.save()
return instance
在views.py引入ModelViewSet,從serializers引入我們實作的序列化器
from rest_framework.viewsets import ViewSet, ModelViewSet
from .serializers import HrefInfoModelSerializer
在views.py實作我們的邏輯處理,rest_framework為我們提供了最基本的增刪改查,我們可以自己實作其他的功能,比如單個查詢指定的資料,
from rest_framework import serializers
from .models import Href
class HrefViewSet(ModelViewSet):
parser_classes = [JSONParser, FormParser]
"""視圖集"""
queryset = models.Href.objects.all()
serializer_class = HrefInfoModelSerializer
# 搜索
search_fields = ('id', 'name')
# 添加鏈接
@action(methods=['post'], detail=False)
@csrf_exempt
def add_href(self, request, *args, **kwargs):
name = request.data.get('name', None)
if name:
print(name)
obj = models.Href.objects.filter(name=name).first()
if obj:
return JsonResponse({
'status': '1001',
'msg': '已經存在此鏈接名稱'
})
else:
serializer = HrefInfoModelSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return JsonResponse({
'status': '1000',
'msg': '添加成功'
})
else:
return JsonResponse({
'status': '1002',
'msg': '插入資料不合法'
})
else:
return Response(status=status.HTTP_204_NO_CONTENT)
pass
# 洗掉鏈接
@action(methods=['delete'], detail=False)
@csrf_exempt
def multiple_delete(self, request, *args, **kwargs):
count = 0
delete_id = request.data.get('id', None)
print(delete_id)
if not delete_id:
return Response(status=status.HTTP_404_NOT_FOUND)
for i in delete_id.split(','):
obj = models.Href.objects.filter(id=i).first()
if obj:
obj.delete()
count = count + 1
else:
return Response(status=status.HTTP_204_NO_CONTENT)
return JsonResponse({
'code': 200,
'msg': '洗掉成功',
'num': count
})
# 獲取單個鏈接資訊
@action(methods=['get'], detail=False)
@csrf_exempt
def single_href(self, request, *args, **kwargs):
query_name = request.data.get('name', None)
print(query_name)
if not query_name:
return Response(status=status.HTTP_404_NOT_FOUND)
else:
href = models.Href.objects.all().filter(name=query_name)
serializer = HrefInfoModelSerializer(instance=href, many=True)
print(serializer.data)
return JsonResponse({
'code': 2010,
'msg': '查詢成功',
'data': serializer.data
})
# 修改資訊
@action(methods=['put'], detail=False)
@csrf_exempt
def edit_href(self, request, *args, **kwargs):
name = request.data.get('name', None)
if name:
obj = models.Href.objects.filter(name=name).first()
serializer = HrefInfoModelSerializer(instance=obj, data=request.data, partial=True)
if serializer.is_valid():
serializer.save(update_fields=['name', 'id'])
return JsonResponse({
'code': 200,
'msg': '更新成功',
})
else:
return JsonResponse({
'code': 201,
'msg': '更新失敗',
})
else:
return Response(status.HTTP_204_NO_CONTENT)
在urls.py引入路徑,rest_framework提供了路徑匹配SimpleRouter,我們不需要一點一點的書寫path了
from rest_framework.routers import DefaultRouter, SimpleRouter
urlpatterns = [
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
router = SimpleRouter()
router.register(r'href', views.HrefViewSet) # 注冊路由
urlpatterns += router.urls # 把生成好的路由拼接到urlpatterns
GET

POST
我們使用postman來進行post以及其他請求

可以看到資料已經插入資料庫中,

PUT
修改資料

可以看出資料已經被修改為localhost

DELETE

可以看到資料庫中id為52的資料已經被洗掉

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259733.html
標籤:python
