Django REST framework 视图的使用
1,使用Request 与 Response
'''在使用了 APIView类时候,此时的 request是封装之后的request,不论什么类型都可以获取!''' from rest_framework.views import APIView from rest_framework.response import Response #使用REST中的 APIView 类代替 view ,这样可以使用 request class BooksView(APIView): # 获取所有的数据! def get(self, request): #在视图之中使用序列化操作 books = BookInfo.objects.all() bookser = BookInfoSer(books, many=True) return Response(bookser.data) # 获取post! def post(self, request): bookser = BookInfoSer(data=request.data) if not bookser.is_valid(): return Response({'erromage': '数据演验证失败!'}) bookser.save() return Response(bookser.data) '''APIView 继承了 Views 重写了 返回request的方法! request.data post与form等都可以使用! request.query_params 是处理 get 的方法! response 响应返回 json数据给前端!也可以在返回加上额外的参数与数据 Response(data, status=None, template_name=None, headers=None, content_type=None) '''
2,使用视图类之中的基类
GenericAPIView 增加了分页控制,过滤后端等的作用
class BooksView(GenericAPIView): '''指定查询集合,必须要有(只要子类继承), 以下方法会调用 queryset 将所有的对象进行加载, 然后进行或者比对,或者获取数据等等操作!''' queryset = BookInfo.objects.all() # 指定查询模块! serializer_class = BookInfoSer # 获取所有的数据! def get(self, request): books = self.get_queryset() bookser = self.get_serializer(books, many=True) return Response(bookser.data) # 获取post! def post(self, request): bookser = self.get_serializer(data=request.data) if not bookser.is_valid(): return Response({'erromage': '数据演验证失败!'}) bookser.save() return Response(bookser.data)
3,5个扩展类
class HeroView(GenericAPIView, ListModelMixin, CreateModelMixin, RetrieveModelMixin): queryset = HeroInfo.objects.all() # 指定查询模块! serializer_class = HeroInfoSerializer authentication_classes = (SessionAuthentication, BasicAuthentication) # 获取所有的数据! def get(self, request): # 调用父类ListModelMixin的 list方法 return self.list(request) # 获取单一所有的数据!这里是自己写的方法,因此路由必须增加匹配 def get_id(self, request, pk): # 调用父类 RetrieveModelMixin 的 list方法 return self.retrieve(request) # 获取post! def post(self, request): # 调用父类 CreateModelMixin 的 post 方法 return self.create(request)
4.指定路由,可以将所有的方法进行封装到一个类之中!
urlpatterns = [ # 视图集的形式,可以指定我们自定义的方法!也可以增加路由的方式,来达到绑定同一个视图函数的自定义函数! url(r'^books/$', views_gene.BooksViewset.as_view({'get': 'lastdata', 'post': 'create', 'put': 'retrieve'})), url(r'^books/lastdata$', views_gene.BooksViewset.as_view({'get': 'lastdata'})), # 甚至可以增加指定的id来进行视图的方法改变! url(r'^books_id/(?P<pk>(\d+)$)', views_gene.BooksViewset.as_view({'get': 'get_id'})) ]