二级视图GenericAPIView
GenericAPIView
1、继承自APIView,为列表视图和详情视图添加了常用的行为和属性
1)行为(方法)
get_queryset:获取queryset的数据集
get_serializer:获取serializer_class序列化器对象
get_object:根据lookup_field获取单个对象
2)属性
queryset:通用的数据集
serializer_class:通用的序列化器
lookup_field:默认是pk,可以手动
2、可以和一个或多个mixin类配合使用
#测试APIView的request from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from app.models import BookInfo from app.serializers import BookModelSerializer #导入GenericAPIView from rest_framework.generics import GenericAPIView #改写类名 #class BookListView(APIView): class BookListGenericAPIView(GenericAPIView): #提供公共的属性 #二级视图的好处是提高代码复用性 。比如需要改为英雄,直接改公共属性就可以了 queryset = BookInfo.objects.all() serializer_class = BookModelSerializer def get(self,request): '''列表视图:查询所有书籍''' #book = BookInfo.objects.all() # book = self.queryset 或者 book = self.get_queryset() #serializer = BookModelSerializer(instance=book,many=True) #serializer = self.serializer_class(isinstance=book,many=True) 或者 #serializer = self.get_serializer_class()(isinstance=book,many=True) 或者 serializer = self.get_serializer(isinstance=book,many=True) return Response(serializer.data) def post(self,request): '''列表视图:创建单本书籍''' book_data = request.data #serializer = BookModelSerializer(data=book_data) serializer = self.serializer_class(data=book_data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data,status=status.HTTP_201_CREATED) #改写详情视图的类 #class BookDetailView(APIView): class BookDetailGenericAPIView(GenericAPIView) #提供通用属性 queryset = BookInfo.objects.all() serializer_class = BookModelSerializer def get(self,request,book_id): '''详情视图:查询一本书籍''' #book = BookInfo.objects.get(id=book_id) 改写为 book = self.get_object() #根据book_id到queryset中取出书籍对象 #serializer = BookModelSerializer(instance=book) serializer = self.get_serializer(instance=book) return Response(serializer.data,status=status.HTTP_200_OK) def put(self,request,book_id): '''修改一本书籍''' #book = BookInfo.objects.get(id=book_id) book = self.get_object() book_data = request.data #serializer = BookModelSerializer(instance=book,data=book_data) serializer = self.get_serializer(instance=book, data=book_data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data,status=status.HTTP_201_CREATED) def delete(self,request,book_id): '''删除一本书籍''' #book = BookInfo.objects.get(id=book_id) book = self.get_object() book.delete() return Response(status.HTTP_204_NO_CONTENT)

浙公网安备 33010602011771号