视图

作者: 小吉头 | 来源:发表于2020-07-21 21:23 被阅读0次

    继承APIView

    from rest_framework.views import APIView
    
    
    class PageView(APIView):
    
        def get(self,request):
            #获取所有用户
            users = User.objects.all()
            #创建分页对象
            pg = PageNumberPagination()
            #获取分页数据
            page_users = pg.paginate_queryset(queryset=users,request=request)
            #序列化
            ser = PageUserSerializer(instance=page_users,many=True)
            #使用restframework提供的Response
            return Response(ser.data)
    

    继承GenericAPIView

    GenericAPIView继承自APIView
    和上面继承APIView流程上没有区别,只是将各个功能封装好

    from rest_framework.generics import GenericAPIView
    
    
    class Page1View(GenericAPIView):
        queryset = User.objects.all()
        serializer_class =  PageUserSerializer
        pagination_class = PageNumberPagination
    
        def get(self,request):
            #获取所有用户
            users = self.get_queryset()
            # 获取分页数据
            page_users = self.paginate_queryset(users)
            #序列化
            ser = self.get_serializer(instance=page_users,many=True)
            #使用restframework提供的Response
            return Response(ser.data)
    

    继承GenericViewSet

    GenericViewSet继承关系:

    class GenericViewSet(ViewSetMixin, generics.GenericAPIView)
    

    ViewSetMixin中也重新了as_view(),优先执行,并且改变了路由的写法
    路由定义:path('page2_view', Page2View.as_view({'get': 'list'})),
    将get请求指定list()处理,其他没有变动,代码如下:

    from rest_framework.viewsets import GenericViewSet
    
    
    class Page2View(GenericViewSet):
        queryset = User.objects.all()
        serializer_class =  PageUserSerializer
        pagination_class = PageNumberPagination
    
        def list(self,request):
            #获取所有用户
            users = self.get_queryset()
            # 获取分页数据
            page_users = self.paginate_queryset(users)
            #序列化
            ser = self.get_serializer(instance=page_users,many=True)
            #使用restframework提供的Response
            return Response(ser.data)
    

    继承ListModelMixin

    查看ListModelMixin源码,里面定义的list()源码其实跟上面自己写的一样

    class ListModelMixin:
        """
        List a queryset.
        """
        def list(self, request, *args, **kwargs):
            queryset = self.filter_queryset(self.get_queryset())
    
            page = self.paginate_queryset(queryset)
            if page is not None:
                serializer = self.get_serializer(page, many=True)
                return self.get_paginated_response(serializer.data)
    
            serializer = self.get_serializer(queryset, many=True)
            return Response(serializer.data)
    

    路由定义:path('page3_view', Page3View.as_view({'get': 'list'})),
    继承自ListModelMixinGenericViewSet,功能更强大,业务代码更精简:

    from rest_framework.mixins import ListModelMixin
    
    
    class Page3View(ListModelMixin,GenericViewSet):
        queryset = User.objects.all()
        serializer_class =  PageUserSerializer
        pagination_class = PageNumberPagination
    

    ListModelMixin帮我们实现了get请求对应的list()方法,可以获取所有记录,如果要实现增加、删除、修改、查找单条记录怎么写?

    继承ModelViewSet

    ModelViewSet继承关系如下,可以实现增删改查

    class ModelViewSet(mixins.CreateModelMixin,
                       mixins.RetrieveModelMixin,
                       mixins.UpdateModelMixin,
                       mixins.DestroyModelMixin,
                       mixins.ListModelMixin,
                       GenericViewSet):
    

    业务代码实现如下,代码进一步精简,并且具备增删改查功能

    from rest_framework.viewsets import ModelViewSet
    
    
    class Page4View(ModelViewSet):
        queryset = User.objects.all()
        serializer_class =  PageUserSerializer
        pagination_class = PageNumberPagination
    

    路由定义(一个url对应了两个路由):

        path('page4_view', Page4View.as_view({'get': 'list','post':'create'})),
        re_path('page4_view/(?P<pk>\d+)/', Page4View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),#根据id 查找单个对象/删除/更新单个对象全部内容/局部更新
    

    支持比如?form=json和.json方式请求

        path('page4_view', Page4View.as_view({'get': 'list','post':'create'})),#http://localhost:8000/page4_view?format=json
        re_path('page4_view\.(?P<format>\w+)', Page4View.as_view({'get': 'list','post':'create'})),#http://localhost:8000/page4_view.json
        re_path('page4_view/(?P<pk>\d+)/', Page4View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),#http://localhost:8000/page4_view/1/?format=json
        re_path('page4_view/(?P<pk>\d+)\.(?P<format>\w+)/', Page4View.as_view({'get': 'retrieve','delete':'destroy','put':'update','patch':'partial_update'})),#http://localhost:8181/page4_view/1.json
    

    restframework提供了更简单的方式,等同上面的4个url

    from rest_framework import routers
    
    router = routers.DefaultRouter()
    router.register(r'xxx',Page4View)#http://localhost:8000/xxx?format=json,http://localhost:8000/xxx.json,http://localhost:8000/xxx/1/?format=json,http://localhost:8181/xxx/1.json
    
    urlpatterns = [
       ... 
       path('', include(router.urls)),
    ]
    
    

    总结

    基本增删改查 使用ModelViewSet
    复杂逻辑 使用APIView或者GenericViewSet(路由中可以自定义请求方式对应的处理方法,示例中通过两条路由区分多条查询和单条查询)

    视图继承关系

    相关文章

      网友评论

          本文标题:视图

          本文链接:https://www.haomeiwen.com/subject/fhslkktx.html