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)
'''
View Code

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)
View Code

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)
View Code

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'}))
]
View Code

 

posted @ 2018-06-16 20:54  十七楼的羊  阅读(148)  评论(0编辑  收藏  举报