DRF框架包含序列化器,视图以及URL视图,三者密不可分,因此本篇聊的是视图部分。在django中rest_framework框架包含的是类视图,类视图区别于函数视图,是将视图封装到类里面,rest_framework框架里面的类视图分为三种视图,一级视图为APIView,二级视图为GenericAPIView,三级视图为ListAPIView,CreateAPIView,RetrieveAPIView,UpdateAPIView,DestoryAPIView.
三级视图继承二级视图GenericAPIView和mixin扩展类,封装好了get,post,put,delete等方法。Mixin扩展类做了序列化以及反序列化等转换工作,GenericAPIView则是增加了列表和详情视图等通用方法,设置序列化器属性和查询结果集属性。下面是使用三级视图的例子:
class ThirdAPIView(ListAPIView,CreateAPIView):
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
二级视图继承自一级视图APIView,二级视图增加了列表和详情视图等通用方法,设置序列化器属性和查询结果集属性。使用get_queryset 返回视图查询结果集,get_serializer返回序列化器对象。下面是列表视图。
class
SencondGenericAPIView(GenericAPIView):
# 定义查询结果集和序列化器属性
queryset = BookInfo.objects.all()
serializer_class = BookInfoSerializer
列表视图
def get(self, request):
queryset = self.get_queryset()
serializer =self.get_serializer(queryset, many=True)
return Response(serializer.data)
def post(self,request):
# 获取新增数据
data=request.data
# 创建序列化器
serializer=self.get_serializer(data=data)
# 校验
serializer.is_valid()
serializer.save()
# 返回响应
return Response(serializer.data)
对于详情视图需要使用get_object返回详情视图所需的模型类数据对象。
#详情视图
def get(self, request, pk):
book = self.get_object()
serializer = self.get_serializer(book)
return Response(serializer.data)
def put(self, request, pk):
book = self.get_object()
# 获取数据
data = request.data
# 传递给序列化器
serializer =self.get_serializer(instance=book, data=data)
if serializer.is_valid():
serializer.save()
# 返回响应
return Response(serializer.data)
else:
returnResponse(status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, pk):
# 获取模型
book = self.get_object()
# 删除
book.delete()
# 返回响应
return Response(status=status.HTTP_204_NO_CONTENT)
一级视图APIView继承自Django中的父类view。与view类似,不同的地方在于他将返回和响应对象进行了封装,Django的view中返回的是HttpRequest与HttpReponse对象,DRF的APIView中返回的是Request和Reponse对象。因为继承的是view,所以在路由进入视图函数后,会调用dispatch()方法中相应的get,post,put,delete等方法,最后返回view的结果给视图函数,视图函数再返回具体的响应。采用request.data接收返回解析之后的请求体数据,类似于Django中标准的request.POST属性。采用request.query_params与Django标准的request.GET相同,获取请求数据。
响应对象构造方式为Response(data,
status=None, template_name=None, headers=None, content_type=None),常用的属性:data为响应数据,status为响应状态。