DRF的序列化
阿新 • • 發佈:2018-11-03
DRF檢視
APIview
django中寫CBV的時候是繼承View,而rest_framework繼承的是APIView,那麼他們兩個有什麼不同
urlpatterns = [ url(r'^book$', BookView.as_view()), url(r'^book/(?P<id>\d+)$', BookEditView.as_view()), ]
不管是View還是APIView最開始呼叫的都是as_view()方法,看原始碼有什麼區別
我們能看到,APIView繼承了View, 並且執行了View中的as_view()方法,最後把view返回了,用csrf_exempt()方法包裹後去掉了csrf的認證。
然後看view中as_view()方法做了什麼
在View中的as_view方法返回了view函式,而view函式執行了self.dispatch()方法 ,但是這裡的dispatch方法按照順序應該從自己開始尋找,而在APIview中,也寫了dispatch方法,所以應該執行的是APIview中的dispatch方法
這裡我我需要注意initialize_request中到底做了什麼
這裡返回的是一個例項化物件
這會django原先的request變成了self._request
檢視
自己寫的版本
# 自己重寫的檢視 from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.viewsets import ViewSetMixin # 獲取要的資料 class GenericAPIView(APIView): queryset = None serializer_class = None # 獲取queryset def get_queryset(self):自己重寫的return self.queryset.all() # 獲取序列化器 def get_serializer(self, *args, **kwargs): return self.serializer_class(*args, **kwargs) # get方法(查詢多條) class ListModelMixin(object): def list(self, request): queryset = self.get_queryset() ser_obj = self.get_serializer(queryset, many=True) return Response(ser_obj.data) # 查詢單條 class RetrieveModelMixin(object): def retrieve(self, request, id): stu_obj = self.get_queryset().filter(id=id).first() ser_obj = self.get_serializer(stu_obj) return Response(ser_obj.data) # post方法 class CreateModelMixin(object): def create(self, request): ser_obj = self.get_serializer(data=request.data) if ser_obj.is_valid(): ser_obj.save() return Response(ser_obj.data) else: return Response(ser_obj.errors) # put/patch方法:修改單個的 class UpdateModelMixin(object): def update(self, request, id): stu_obj = self.get_queryset().filter(id=id).first() ser_obj = self.get_serializer(instance=stu_obj, data=request.data, partial=True) if ser_obj.is_valid(): ser_obj.save() return Response(ser_obj.validated_data) return Response(ser_obj.errors) # delete方法 class DestroyModelsMixin(object): def destroy(self, request, id): stu_obj = self.get_queryset().filter(id=id).first() if stu_obj: stu_obj.delete() return Response("") return Response("刪除的物件不存在") # # 所有方法只要繼承這個就可以 class ModelViewSet( ViewSetMixin, GenericAPIView, ListModelMixin, RetrieveModelMixin, CreateModelMixin, UpdateModelMixin, DestroyModelsMixin, ): pass class Student(ModelViewSet): queryset = models.Student.objects serializer_class = StudentSerializer
他還有一個自帶的模組和這個一樣
from rest_framework.viewsets import ModelViewSet class Student(ModelViewSet): queryset = models.Student.objects serializer_class = StudentSerializer自帶的模組
urls.py程式碼
DRF的路由
這個路由其實也封裝好了,但是封裝越好的東西,應用場景限制的也越多
from .views import BookView from rest_framework.routers import DefaultRouter router = DefaultRouter() router.register(r"book", BookView) urlpatterns = [ # url(r'^book$', BookView.as_view()), # url(r'^book/(?P<id>\d+)$', BookEditView.as_view()), # url(r'^book$', BookView.as_view({"get": "list", "post": "create"})), # url(r'^book/(?P<pk>\d+)$', BookView.as_view({"get": "retrieve", "patch": "update", "delete": "destroy"})), ] urlpatterns += router.urls路由