一、APIView
REST框架提供了一个类APIViewView,APIView类在以下方面与常规类不同,它是继承于View类。
传递给处理程序方法的请求将是REST框架的实例,而不是Django的实例。
RequestHttpRequest处理程序方法可以返回REST框架,而不是Django的。并在响应上设置正确的呈现器。
ResponseHttpResponse任何异常都将被捕获并调解为适当的响应。
APIException传入的请求将经过身份验证,并且在将请求调度到处理程序方法之前,将运行适当的权限和/或限制检查。
使用该类与使用常规类几乎相同,像往常一样,传入的请求被调度到适当的处理程序方法。此外,可以在控制 API 策略各个方面的类上设置许多属性。
from rest_framework.views import APIView from rest_framework.response import Response from book.models import BookInfo from drf_book.serializer import BookSerializer class BooksAPIView(APIView): """ 获取所有图书和保存图书 """ def get(self, request): """ 获取所有图书 :param request: :return: """ # 1、查询图书表获取所有图书对象 books = BookInfo.objects.all() # 2、提取所有对象的字段内容 # 初始化生成序列化器对象 ser = BookSerializer(books, many=True) # 使用序列化器对象的data方法获取序列化后的结果 data = ser.data # 3、返回所有对象字段内容 return Response({'book_list': data}) def post(self, request): """ 保存图书 :param request: :return: """ # 1、获取保存的图书数据 data=request.data # 2、验证图书数据字段 ser = BookSerializer(data=data) # is_valid是序列化器的验证方法 ser.is_valid(raise_exception=True) # raise_exception=True 验证失败直接返回 # ser.errors获取验证结果信息 # 3、保存图书 # 调用序列化器中封装保存方法create ser.save() return Response(ser.data) class BookAPIView(APIView): """ 获取单一图书数据 更新图书 删除图书 """ def get(self, request, pk): """ 获取单一图书数据 :param request: :param pk: :return: """ # 1、根据pk值查询图书对象 try: book = BookInfo.objects.get(id=pk) except: return Response({'error': '错误的id值'}) # 2、返回图书数据 ser = BookSerializer(book) return Response( ser.data ) def put(self, request, pk): """ 更新图书 :param request: :param pk: :return: """ # 1、获取保存的图书数据 data = request.data # 2、验证图书数据字段 try: book = BookInfo.objects.get(id=pk) except: return Response({'error': '错误的id值'}) ser = BookSerializer(book, data=data) # is_valid是序列化器的验证方法 ser.is_valid(raise_exception=True) # raise_exception=True 验证失败直接返回 # 3、更新图书 ser.save() # # 4、返回保存后的图书数据 return Response(ser.data) def delete(self, request, pk): """ 删除图书 :param request: :param pk: :return: """ # 1、查询删除的图书对象 try: book = BookInfo.objects.get(id=pk) except: return Response({'error': '错误的id值'}) # 2、逻辑 book.is_delete = True book.save() # 物理删除 # book.delete() # 3、返回结果 return Response({})