2個檢視基類,5個檢視擴充套件類,9個檢視子類,檢視集,drf自動生成路由
阿新 • • 發佈:2021-07-03
兩個檢視基類
APIView
GenericAPIView
# 匯入
from rest_framework.generics import GenericAPIView
類GenericView 繼承了APIView,
class GenericAPIView(views.APIView):
# 這裡面定義了兩個引數
queryset = None
serializer_class = None
# 記住3個方法
def get_queryset(self) # 獲取所有資料,查詢所有需要用到
def get_object(self): # 查詢單個物件,需要用到
def get_serializer(self, *args, **kwargs)
...
return serializer_class(*args, **kwargs)# 使用這個方法得到序列化類的物件,可以傳selif.get_serializer(instance,data,many)
def get_serializer_class(self)
...
return self.serializer_class
繼承了GenericAPIView類的檢視層類如下:
class BookGeneric(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookModelSerializers
# 查詢所有
def get(self,request,*args, **kwargs):
obj_list = self.get_queryset()
ser = self.get_serializer(obj_list, many=True)
return Response(ser.data)
def post(self,request,*args, **kwargs):
pass
class BookDetailGeneric(GenericAPIView):
queryset = Book.objects.all()
serializer_class = BookModelSerializers
# 修改某一個
def put(self, request, pk):
obj = self.get_object().filter(pk=pk).first()
ser = self.get_serializer(obj, data=request.data)
return Response(ser.data)
def get(self, request, pk):
pass
def delete(self, request,pk):
pass
五個檢視擴充套件類(沒有繼承其他類)
# 匯入5個檢視擴充套件類
# mixins.py
from rest_framework.mixins import CreateModelMixin,ListModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
# 查詢所有,ListModelMixin,
# 新增 CreateModelMixin,
# 查詢單個 RetrieveModelMixin
# 更新某個 UpdateModelMixin
# 刪除某個 DestoryModelMixin
繼承GenericAPIView類 和檢視擴充套件類的檢視類
# 當有了上面5個檢視擴充套件類以後,就可以在我們自己寫的檢視類中自由組合的繼承他們,實現不同的介面功能
# 記得這裡寫了一個小作業,繼承GenericAPIView和一個自己寫的類,在新建檢視類中只配置那兩個引數,即可實現5個介面
# 如下,為一個查詢所有和新增的方法
class BookGenericList(GenericAPIView, ListModelMixin, CreateModelMixin):
queryset = Book.objects.all()
serializer_class = BookModelSerializers
def get(self, request, *args, **kwargs):
return self.list(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
return self.create(request, *args, **kwargs)
9個檢視子類
現在,改寫一下上述檢視類,編寫檢視類繼承檢視子類實現同樣的功能,並且實現了程式碼少量書寫;
# 匯入檢視子類
# rest_framework.generics
from rest_framework.generics import ListAPIView,CreateAPIView,UpdateAPIView,DestroyAPIView,RetrieveAPIView
from rest_framework.generics import ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView
from rest_framework.generics import RetrieveUpdateDestroyAPIView
檢視類
# 此時我們只需要在自己寫的檢視類中繼承檢視子類ListCreateAPIView,就可以實現對資料的查詢所有,和增加一條
class BookListCreate(ListCreateAPIView):
queryset = Book.objects.all()
serializer_class = BookModelSerializers
# 刪除一條資料
class BookDestory(DestoryAPIView):
queryset = Book.objects.all()
serializer_class = BookModelSerializers
檢視集
可以看到檢視類繼承檢視子類之後的檢視類寫法變簡潔了,但是可以看見,上面兩個檢視類除了類名和繼承的類不一樣,下面的程式碼主體一樣。使用檢視集以後,能否將5個介面寫在一個檢視類中。請看下邊
# 匯入檢視集類
from rest_framework.viewsets import ModelViewSet,GenericViewSet,ViewSetMixin,ReadOnlyModelViewSet,ViewSet
路由
# 使用檢視集的檢視類的url
path('bookviewset', views.BookViewSet.as_view({'get': 'list', 'post': 'create'})),
path('bookdetailviewset/<int:pk>', views.BookViewSet.as_view({'get': 'retrieve', 'put': 'update', 'delete': 'destroy'}))
實現5個介面的檢視類
# 只繼承了一個檢視集ModelViewSet類就實現了5個介面的功能
class BookViewSet(ModelViewSet):
queryset = Book.objects.all()
serializer_class = BookModelSerializers
有點繞的東西
class ModelViewSet(mixins.CreateModelMixin,
mixins.RetrieveModelMixin,
mixins.UpdateModelMixin,
mixins.DestroyModelMixin,
mixins.ListModelMixin,
GenericViewSet):
from rest_framework.generics
class GenericViewSet(ViewSetMixin, GenericAPIView):
pass
# 還是要抓住那個cls,以及cls例項化出來的物件
class ViewSetMixin: