GenericAPIView
1.视图层类使用GenericAPIView继承,能简化类里的方法code。
2.简化后的方法code格式基本通用,简单修改即可应用到其他类。
一、class开始加入
queryset = Book.objects
serializer_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.objects
serializer_class = BookModelSerializer
def 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.data
else:
response.status= 101
response.msg = '数据校验失败'
response.data= book_ser.errors
return 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.objects
serializer_class = BookModelSerializer
# 使用封装response
def get(self, request):
response=MyResponse()
book = self.get_queryset()
book_ser = self.get_serializer(book, many=True) # 序列化多条。 如果一条,不需要写
response.data = book_ser.data
return Response(response.get_dic)
# 新增
def post(self, request):
response=MyResponse()
# 新增没有instance,只有data
book_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.data
else:
response.status = 102
response.msg = '新增数据校验失败'
response.data = book_ser.data
return 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.objects
serializer_class = BookModelSerializer
def get(self,request):
return self.list(request)
def post(self,request):
return self.create(request)
class Book3DetailView(GenericAPIView,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
queryset = Book.objects
serializer_class = BookModelSerializer
def 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.objects
serializer_class = BookModelSerializer
# class Book4DetailView(UpdateAPIView,RetrieveAPIView,DestroyAPIView):
class Book4DetailView(RetrieveUpdateDestroyAPIView):
queryset = Book.objects
serializer_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.objects
serializer_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)