Rest Framework之视图

视图

    a.以前写的视图

      class TestView(View): 

        pass

    b.后来写的视图

      class TestView(APIView): # View

        pass

    c.不怎么用的视图方法,继承GenericAPIView

 1 from api.utils.serializsers.pager import PagerSerialiser
 2 from rest_framework.generics import GenericAPIView
 3 
 4 
 5 class Test1View(GenericAPIView): # APIView
 6     queryset = models.UserInfo.objects.all()
 7     serializer_class = PagerSerialiser
 8     pagination_class = PageNumberPagination
 9 
10     def get(self, request, *args, **kwargs):
11         # 获取数据
12         userinfo = self.get_queryset()
13         # 分页处理
14         pager_userinfo = self.paginate_queryset(userinfo)
15         # 序列化
16         ser = self.get_serializer(instance=pager_userinfo, many=True)
17         return Response("...")
GenericAPIView

    d.继承GenericViewSet,这个类继承了ViewSetMixin,generics.GenericAPIView。

      此方法类中ViewSetMixin中,重写了as_view方法,

      在URL中as_view必须要传递参数例如:{"get":"list"}

      意思是修改了method的调用的方法,不再根据请求的method来执行方法。

 

 1 class Test1View(GenericViewSet):
 2     queryset = models.UserInfo.objects.all()
 3     serializer_class = PagerSerialiser
 4     pagination_class = MyPageNumberPagination
 5 
 6     def list(self, request, *args, **kwargs):
 7         # 获取数据
 8         userinfo = self.get_queryset()
 9         # 分页处理
10         pager_userinfo = self.paginate_queryset(userinfo)
11         # 序列化
12         ser = self.get_serializer(instance=pager_userinfo, many=True)
13         return Response(ser.data)

 

 

     e.继承ModelViewSet,这个类继承了mixins中的

      增CreateModelMixin、查ListModelMixin(多条数据)

      (根据ID的单条数据操作)删DestroyModelMixin、改UpdateModelMixin、查RetrieveModelMixin

      以及GenericViewSet类。

1 class Test1View(ModelViewSet):
2     queryset = models.UserInfo.objects.all()
3     serializer_class = PagerSerialiser
4     pagination_class = MyPageNumberPagination

       继承的类越多,提供的功能越多,需要写的代码越少

      需要注意的是,在URL中就有了变化

1 re_path('(?P<version>[v1|v2]+)/Test1View/$', views.Test1View.as_view({'get': 'list', "post":"create"})),
2 re_path('(?P<version>[v1|v2]+)/Test1View/(?P<pk>\d+)$', views.Test1View.as_view({'get': 'retrieve', "delete": "destroy","put": "update","patch": "partial_update"})),

 

      注意:这里能够执行的增删改查等操作都是简单的单表操作。

 

 

   

posted @ 2019-05-22 10:09  cunzhishu  阅读(74)  评论(0)    收藏  举报