一、GenericAPIView
此类扩展了 REST 框架的类,为标准列表视图和详细信息视图添加了通常需要的行为。GenericAPIView继承于APIView。
以下属性控制基本视图行为。
queryset:应用于从此视图返回对象的查询集。通常,必须设置此属性或重写该方法。如果要重写视图方法,请务必调用而不是直接访问此属性,因为将评估一次,并且这些结果将缓存用于所有后续请求。
serializer_class:应用于验证和反序列化输入以及序列化输出的序列化程序类。通常,必须设置此属性或重写该方法。
lookup_field:应用于执行各个模型实例的对象查找的模型字段。缺省值为 。请注意,使用超链接 API时,如果需要使用自定义值,则需要确保 API 视图和序列化程序类都设置了查找字段。
lookup_url_kwarg:应用于对象查找的 URL 关键字参数。URL conf应包含与此值对应的关键字参数。如果未设置,则默认使用与 相同的值。
from rest_framework.views import APIView from rest_framework.generics import GenericAPIView from rest_framework.response import Response from book.models import BookInfo from drf_book.serializer import BookSerializer class BooksGenericAPIView(GenericAPIView): """ 获取所有图书和保存图书 """ # 指定查询集属性 queryset = BookInfo.objects.all() # 指定序列化器 serializer_class = BookSerializer def get(self, request): """ 获取所有图书 :param request: :return: """ # 1、查询图书表获取所有图书对象 self.get_queryset() 获取queryset属性中的所有数据 books = self.get_queryset() # 2、提取所有对象的字段内容 # 初始化生成序列化器对象 self.get_serializer 获取serializer_class所指定的序列化器进行初始化操作 ser = self.get_serializer(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 = self.get_serializer(data=data) # is_valid是序列化器的验证方法 ser.is_valid(raise_exception=True) # raise_exception=True 验证失败直接返回 # ser.errors获取验证结果信息 # 3、保存图书 # 调用序列化器中封装保存方法create ser.save() return Response(ser.data) class BookGenericAPIView(GenericAPIView): """ 获取单一图书数据 更新图书 删除图书 """ # 指定查询集属性 queryset = BookInfo.objects.all() # 指定序列化器 serializer_class = BookSerializer def get(self, request, pk): """ 获取单一图书数据 :param request: :param pk: :return: """ # 1、根据pk值查询图书对象 try: # self.get_object()从queryset中获取当前pk所对应的数据对象 book = self.get_object() except: return Response({'error': '错误的id值'}) # 2、返回图书数据 ser = self.get_serializer(book) return Response( ser.data ) def put(self, request, pk): """ 更新图书 :param request: :param pk: :return: """ # 1、获取保存的图书数据 data = request.data # 2、验证图书数据字段 try: book = self.get_object() except: return Response({'error': '错误的id值'}) ser = self.get_serializer(book) # 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 = self.get_serializer() except: return Response({'error': '错误的id值'}) # 2、逻辑 book.is_delete = True book.save() # 物理删除 # book.delete() # 3、返回结果 return Response({})