二级视图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)

 

posted @ 2020-09-25 10:36  亦木121  阅读(166)  评论(0)    收藏  举报