特斯拉:德國柏林超級工廠每 10 小時就能生產一輛 Model Y,而大眾卻需要 30 小時
阿新 • • 發佈:2022-03-31
APIView
from rest_framework.views import APIView
類屬性
renderer_classes,
parser_classes
get方法,post方法,delete方法寫法跟之前的View一樣,只不過request物件變成了新的request丟下,比之前的View多了三大認證和全域性異常處理
程式碼
class BookView(APIView): def get(self, request): book_list = Book.objects.all() ser = BookSerializers(instance=book_list, many=True)return Response(ser.data, headers={'name': 'zys'}) def post(self, request): ser = BookSerializers(data=request.data) if ser.is_valid(): ser.save() return Response({"code": 100, "msg": "新增成功", "data": ser.data}) return Response({"code": 101, "msg": "新增出錯", "err": ser.errors}) class BookDataView(APIView): def get(self, request, pk): book = Book.objects.all().filter(pk=pk).frist() ser = BookSerializers(instance=book) return Response(ser.data) def put(self, request, pk): book = Book.objects.all().filter(pk=pk).first() ser= BookSerializers(instance=book, data=request.data) if ser.is_valid(): ser.save() return Response({"code": 100, "msg": "修改成功", "data": ser.data}) return Response({"code": 101, "msg": "修改出錯", "err": ser.errors}) def delete(self, request, pk): Book.objects.filter(pk=pk).delete() return Response({"code": 100, "msg": "刪除成功", })
GenericAPIView
繼承了APIView ,多了屬性和方法
from rest_framework.generics import GenericAPIView
屬性
-queryset = None -serializer_class = None -lookup_field = 'pk' # 查詢單條,分組分出來的引數,轉換器物件引數的名字 -filter_backends # 過濾排序功能會用它 -pagination_class # 分頁功能
方法
-get_queryset() # 獲取要序列化的資料,後期可能會重寫 -get_object() # 通過lookup_field查詢的 -get_serializer() # 使用它序列化 -get_serializer_class() # 返回序列化類 ,後期可能重寫
程式碼
class BookView(GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializers def get(self, request): obj = self.get_queryset() ser = self.get_serializer(instance=obj, many=True) return Response(ser.data) def post(self, request): ser = self.get_serializer(data=request.data) if ser.is_valid(): ser.save() return Response({"code": 100, "msg": "新增成功", "data": ser.data}) return Response({"code": 101, "msg": "新增出錯", "err": ser.errors}) class BookDataView(GenericAPIView): queryset = Book.objects.all() serializer_class = BookSerializers def get(self, request, pk): obj = self.get_object() ser = self.get_serializer(instance=obj) return Response(ser.data) def put(self, request, pk): obj = self.get_object() ser = self.get_serializer(nstance=obj, data=request.data) if ser.is_valid(): ser.save() return Response({"code": 100, "msg": "修改成功", "data": ser.data}) return Response({"code": 101, "msg": "修改出錯", "err": ser.errors}) def delete(self, request, pk): self.get_object().delete() return Response({"code": 100, "msg": "刪除成功", })
5個檢視擴充套件類(不是檢視類,沒有整合APIView,需要配合GenericAPIView)
新增,查詢單條,查詢所有,修改,刪除
from rest_framework.mixins import CreateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin
程式碼
class PublishView(GenericAPIView,CreateModelMixin,ListModelMixin): queryset = Publish.objects.all() serializer_class = PublishSerializers def get(self, request): return super().list(request) def post(self, request): return super().create(request) class PublishDataView(GenericAPIView,DestroyModelMixin,RetrieveModelMixin,UpdateModelMixin): queryset = Publish.objects.all() serializer_class = PublishSerializers def get(self, request, *args, **kwargs): return super().retrieve(request,*args, **kwargs) def put(self, request, *args, **kwargs): return super().update(request,*args, **kwargs) def delete(self, request, *args, **kwargs): return super().destroy(request, *args, **kwargs)
9個檢視子類---》是檢視類
from rest_framework.generics import CreateAPIView, ListAPIView, DestroyAPIView, RetrieveAPIView, UpdateAPIView, \ ListCreateAPIView, RetrieveUpdateAPIView, RetrieveUpdateDestroyAPIView, RetrieveDestroyAPIView
程式碼
class PublishView(ListCreateAPIView): # 查詢所有和新增介面 # class PublishView(CreateAPIView): # 新增介面 # class PublishView(ListAPIView): # 查詢所有介面 queryset = Publish.objects.all() serializer_class = PublishSerializers # class PublishDataView(RetrieveUpdateDestroyAPIView): # 查詢單條,刪除,修改 # class PublishDataView(RetrieveAPIView): # 查詢單條 # class PublishDataView(DestroyAPIView): # 刪除 # class PublishDataView(UpdateAPIView): # 修改 # class PublishDataView(RetrieveDestroyAPIView): # 查詢單條和刪除 # class PublishDataView(RetrieveUpdateDestroyAPIView): # 查詢單條和更新 class PublishDataView(UpdateAPIView, DestroyAPIView): # 更新和刪除 queryset = Publish.objects.all() serializer_class = PublishSerializers
通過ViewSet寫檢視類
from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
ModelViewSet
# 繼承了5個試圖擴充套件類+GenericViewSet(ViewSetMixin, generics.GenericAPIView) # ViewSetMixin控制了路由寫法變了 # class PublishView(ModelViewSet): # 修改路由,5個介面 # queryset = Publish.objects.all() # serializer_class = PublishSerializers
ReadOnlyModelViewSet
class PublishView(ReadOnlyModelViewSet): # 修改路由,只讀,查所有,查單個 queryset = Publish.objects.all() serializer_class = PublishSerializers
關於路由的兩種書寫方法
第一種
router = SimpleRouter() router.register('publish', views.PublishView, 'publish') urlpatterns = [ path('admin/', admin.site.urls), # path('publish/', views.PublishView.as_view()), # path('publish/<int:pk>', views.PublishDataView.as_view()), path('books/', views.BookView.as_view()), path('books/<int:pk>', views.BookDataView.as_view()), ] # 把路由加入到urlpatterns的列表中 # 第一種方法 # router.urls 他會自動生成 publish/ publish/<int:pk>print(router.urls)urlpatterns += router.urls # 兩個列表相加
第二種
需匯入include
from django.urls import path, include from app01 import views from rest_framework.routers import SimpleRouter router = SimpleRouter() router.register('publish', views.PublishView, 'publish') urlpatterns = [ path('admin/', admin.site.urls), # path('publish/', views.PublishView.as_view()), # path('publish/<int:pk>', views.PublishDataView.as_view()), path('books/', views.BookView.as_view()), path('books/<int:pk>', views.BookDataView.as_view()), path('api/v1/', include(router.urls)) # 前面可以加相加的東西 例如 'api/v1/' ]
關於路由書寫的一些總結
# ViewSet=APIView+ViewSetMixin # GenericViewSet=GenericAPIView+ViewSetMixin from rest_framework.viewsets import ViewSet,GenericViewSet from rest_framework.viewsets import ViewSetMixin
以後只要想自動生成路由,必須繼承ViewSetMixin及其子類,之前的寫法可以沿用,只是如果要自動生成路由可以選擇繼承ViewSet,GenericViewSet