django-rest-framework中两个基类APIView、GenericAPIView使用详解

两个基类APIView、GenericAPIView

1. APIView讲解

 2. APIView实现增删改查

class BookListAPIView(APIView):
    """图书列表类视图"""
    def get(self, request):
        books = BookInfo.objects.all()
        serializers = BookInfoSerializer(instance=books, many=True)
        # print(serializers.data)  # OrderDict类型
        response = Response(data=serializers.data)
        # print(response.data)  # 响应对象未渲染处理的数据, OrderDict类型
        # 由于render渲染是在内部实现的,所以此处还不能显示普通字典类型
        # print(response.content)  # 处理后要响应给前端的数据, Dict类型
        return response

    def post(self, request):
        # 获取前端请求体数据,创建序列化器进行反序列化
        serializer = BookInfoSerializer(data=request.data)
        # 调用序列化器的is_valid方法进行校验
        serializer.is_valid(raise_exception=True)
        # 调用序列化器的save方法,执行create方法
        serializer.save()
        # 反序列化后会自动序列化,所以直接响应即可
        return Response(data=serializer.data, status=status.HTTP_201_CREATED)


class BookDetailAPIView(APIView):
    """图书详情类视图"""
    @staticmethod
    def get_book(pk):
        # 查询图书
        try:
            book = BookInfo.objects.get(id=pk)
        except BookInfo.DoesNotExist:
            book = ""
            return book
        else:
            return book

    def get(self, request, pk):
        book = self.get_book(pk)
        if not book:
            return Response({"err": "所查图书不存在"}, status=status.HTTP_404_NOT_FOUND)
        # 创建序列化器进行序列化
        serializer = BookInfoSerializer(book)
        # 响应
        return Response(data=serializer.data)

    def put(self, request, pk):
        # 查看图书是否存在
        book = self.get_book(pk)
        if not book:
            return Response({"err": "图书不存在,无法更新"}, status=status.HTTP_404_NOT_FOUND)
        # 接收前端请求体数据,创建序列化器进行反序列化
        serializer = BookInfoSerializer(instance=book, data=request.data)
        # 调用序列化器的is_valid方法进行校验
        serializer.is_valid(raise_exception=True)
        # 调用序列化器的save方法,执行update方法
        serializer.save()
        # 自动帮我们序列化,直接响应
        return Response(serializer.data)

    def delete(self, request, pk):
        book = self.get_book(pk)
        if not book:
            return Response({"err": "所查图书不存在, 无法删除"}, status=status.HTTP_404_NOT_FOUND)
        book.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

3. GenericAPIView讲解

(1)GnericAPIView继承自APIView

(2)如果我们定义的类视图继承自GenericAPIView,那么在创建序列化器对象时,会将request请求对象、format响应的格式、view视图对象一并传递给序列化器对象,

在定义序列化器对象里面可以直接使用

(3)GenericAPIView主要增加了操作序列化器和数据库查询的方法,主要作用是为Mixin扩展类的执行提供方法支持,通常在使用时可以搭配一个或多个Mixin扩展类

(4)提供的关于序列化器使用的属性与方法

(5)提供的关于数据库查询的属性与方法

4. GenericAPIView实现增删改查

class GBookListAPIView(GenericAPIView):
    """列表视图"""
    # 指定查询集、序列化器类
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self, request):
        books = self.get_queryset()
        serializer = self.get_serializer(instance=books, many=True)
        return Response(data=serializer.data)

    def post(self, request):
        # 接收前端请求数据,创建序列化器进行反序列化
        serializer = self.get_serializer(data=request.data)
        # 校验
        serializer.is_valid(raise_exception=True)
        # 保存
        serializer.save()
        # 响应
        return Response(data=serializer.data, status=status.HTTP_201_CREATED)


class GBookDetailAPIView(GenericAPIView):
    """详情视图"""
    # 指定查询集和序列化器
    queryset = BookInfo.objects.all()
    serializer_class = BookInfoSerializer

    def get(self, request, pk):
        book = self.get_object()
        serializer = self.get_serializer(instance=book)
        return Response(data=serializer.data)

    def put(self, request, pk):
        # 查询数据是否存在
        book = self.get_object()
        # 接收前端请求体数据,创建序列化器并进行反序列化
        serializer = self.get_serializer(instance=book, data=request.data)
        # 校验
        serializer.is_valid(raise_exception=True)
        # 保存
        serializer.save()
        # 响应
        return Response(data=serializer.data)

    def delete(self, request, pk):
        book = self.get_object()
        book.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

猜你喜欢

转载自blog.csdn.net/weixin_42289273/article/details/114159089
今日推荐