两个基类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)