GenericAPIView
1.視圖層類使用GenericAPIView繼承,能簡化類里的方法code。
2.簡化后的方法code格式基本通用,簡單修改即可應用到其他類。
一、class開始加入
queryset = Book.objectsserializer_class = BookModelSerializer
二、方法里獲取對象
a.查詢一個使用,如需要pk值查詢
book = self.get_object()
b.查詢多個,如獲取所有對象
book = self.get_queryset()
c.序列化方法使用self.get_serializer()
括號內原來是什么參數,就寫什么參數,如
instance=book, data=request.data,
many=True
三、代碼views.py
from app01.models import Book
from app01.ser import BookSerializer,BookModelSerializer
from rest_framework.response import Response
from rest_framework.generics import GenericAPIView
# 自己學的response
from app01.utils import MyResponse# 基于GenericAPIView
class BookView(GenericAPIView):queryset = Book.objectsserializer_class = BookModelSerializerdef get(self, request, pk):book = self.get_object()book_ser = self.get_serializer(book)return Response(book_ser.data)def put(self, request, pk):response = MyResponse()book = self.get_object()book_ser = self.get_serializer(instance=book, data=request.data)# 要數據驗證if book_ser.is_valid(): # 返回True 表示驗證通過book_ser.save()response.data = book_ser.dataelse:response.status= 101response.msg = '數據校驗失敗'response.data= book_ser.errorsreturn Response(response.get_dic)def delete(self, request, pk):ret = Book.objects.filter(pk=pk).delete()return Response({'status': 100, 'msg': '刪除成功'})class BooksView(GenericAPIView):queryset = Book.objectsserializer_class = BookModelSerializer# 使用封裝responsedef get(self, request):response=MyResponse()book = self.get_queryset()book_ser = self.get_serializer(book, many=True) # 序列化多條。 如果一條,不需要寫response.data = book_ser.datareturn Response(response.get_dic)# 新增def post(self, request):response=MyResponse()# 新增沒有instance,只有databook_ser = self.get_serializer(data=request.data)# 如果沒有data=,會報錯。第一個參數是instance# book_ser = BookSerializer(request.data)# 校驗字段if book_ser.is_valid():book_ser.save()response.data = book_ser.dataelse:response.status = 102response.msg = '新增數據校驗失敗'response.data = book_ser.datareturn Response(response.get_dic)
5個視圖擴展類
分別如下,
ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin
from app01.models import Book
from rest_framework.mixins import ListModelMixin,CreateModelMixin,UpdateModelMixin,DestroyModelMixin,RetrieveModelMixin# 5個擴展類
class Books3View(GenericAPIView,ListModelMixin,CreateModelMixin):queryset = Book.objectsserializer_class = BookModelSerializerdef get(self,request):return self.list(request)def post(self,request):return self.create(request)class Book3DetailView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):queryset = Book.objectsserializer_class = BookModelSerializerdef get(self,request,pk):return self.retrieve(request,pk)def put(self,request,pk):return self.update(request,pk)def delete(self,request,pk):return self.destroy(request,pk)
GenericAPIView的視圖子類 9個
create,update等對應方法可以單獨繼承,也有組合的類繼承,所以有9個。
# 基于 GenericAPIView的視圖子類9個
from rest_framework.generics import CreateAPIView,ListAPIView,UpdateAPIView,RetrieveAPIView,DestroyAPIView,ListCreateAPIView,RetrieveUpdateAPIView,RetrieveDestroyAPIView,RetrieveUpdateDestroyAPIView# class Books4View(ListAPIView,CreateAPIView):
class Books4View(ListCreateAPIView):queryset = Book.objectsserializer_class = BookModelSerializer# class Book4DetailView(UpdateAPIView,RetrieveAPIView,DestroyAPIView):
class Book4DetailView(RetrieveUpdateDestroyAPIView):queryset = Book.objectsserializer_class = BookModelSerializer
ModelViewSet
簡寫成一個class,路由需要特別寫法。
urls.py
path('books5/', views.Books5View.as_view(actions={'get':'list','post':'create'})),re_path('^books5/(?P<pk>\d+)', views.Books5View.as_view(actions={'get':'retrieve','put':'update','delete':'destroy'})),
views.py
# 使用ModelViewSet編寫5個接口
from rest_framework.viewsets import ModelViewSet
class Books5View(ModelViewSet):queryset = Book.objectsserializer_class = BookModelSerializer
使用ViewSetMixin 自定義方法名字
path('books6/', views.Books6View.as_view(actions={'get': 'get_all_book'})),
# 使用ViewSetMixin 自定義方法名字
from rest_framework.viewsets import ViewSetMixin# ViewSetMixin一定放在前面,重寫as_view方法
class Books6View(ViewSetMixin,GenericAPIView):def get_all_book(self,request):books = Book.objects.all()book_ser = BookSerializer(books, many=True)return Response(book_ser.data)