1. 程式人生 > >DRF基類APIView提供的Request、Response和序列化器的綜合使用

DRF基類APIView提供的Request、Response和序列化器的綜合使用

關於DRF基類APIView提供的Request和Response物件的使用,可以看我的另一篇博文:https://www.cnblogs.com/chichung/p/9939864.html

綜合使用:

from django.http import HttpResponse
from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView
from user.models import Department
from
user.serializers import DepartmentSerializer class DepartmentListAPIView(APIView): def get(self,request): """查詢多條資料""" dep = Department.objects.all() # 建立序列化器物件 serializer = DepartmentSerializer(instance=dep,many=True) # 序列化:物件->字典 data_dict = serializer.data
# DRF的Response物件可以把字典轉換為請求頭指定的格式返回 return Response(data=data_dict) def post(self,request): """新增一條資料""" # DRF的Request物件直接把接受到的值轉換為字典 data_dict = request.data # 建立序列化器物件 serializer = DepartmentSerializer(instance=None,data=data_dict) # 校驗校驗不通過,拋異常(反序列化的功能)
serializer.is_valid(raise_exception=True) # 反序列化,把字典的資料存進資料庫 serializer.save() # restful風格,新增要返回新增資料的那一列內容。用了序列化,把物件轉換為字典,同時Response處理。 return Response(data=serializer.data) class DepartmentDetailAPIView(APIView): def get(self,request,pk): """查詢一條資料""" # 查詢出該條資料的物件 try: dep = Department.objects.get(id=pk) except Department.DoesNotExist: return HttpResponse(status=status.HTTP_404_NOT_FOUND) # 建立序列化器物件 serializer = DepartmentSerializer(instance=dep) # 序列化,把物件轉換為字典,同時Response根據請求頭返回相應的格式 return Response(data=serializer.data) def post(self,request,pk): """修改部門""" # DRF的Request物件直接把接受到的值轉換為字典 data_dict = request.data # 查詢出要修改的資料 try: dep = Department.objects.get(id=pk) except Department.DoesNotExist: return HttpResponse(status=404) # 建立序列化器物件 serializer = DepartmentSerializer(instance=dep,data=data_dict) # 反序列化,校驗引數是否正確,若不正確,拋異常 serializer.is_valid(raise_exception=True) # 反序列化,把字典的資料存進資料庫 serializer.save() # 序列化,把物件轉換為字典。同時DRF的Response物件根據請求頭返回相應的格式 return Response(serializer.data) def delete(self,request,pk): """刪除一個部門""" try: dep = Department.objects.get(id=pk) except Department.DoesNotExist: return HttpResponse(status=404) dep.delete() return Response(status=status.HTTP_204_NO_CONTENT)

 

相應路由的配置:

urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^departments$',views.DepartmentListAPIView.as_view()),
    url(r'^departments/(?P<pk>\d+)$',views.DepartmentDetailAPIView.as_view())
]