zoukankan      html  css  js  c++  java
  • Django Rest Framework --- 视图组件

    一:视图组件的作用

      在每一个视图类中都写请求方法,并且书写逻辑,这样会大大增加开发时间,因此我们可以对这一类利用面向对象的封装来解决。

    二:手动封装视图类

      view.py

    # 获取全部数据
    class List:
        def list(self, request):
            query_set_list = self.query_set_list
            data_serializer = self.ser(query_set_list, many=True)
            response = {"status": 100, "message": "数据获取成功"}
            response['data'] = data_serializer.data
            return Response(response)
    
    
    # 创建新数据
    class Create:
        def create(self, request):
            data_serializer = self.ser(data=request.data)
            # 数据校验
            if data_serializer.is_valid():
                data_serializer.save()
                response = {"status": 100, "message": "创建用户成功", "data": data_serializer.data}
            else:
                response = {"status": 100, "message": data_serializer.errors, "data": ""}
            return Response(response)
    
    
    # 获取一个数据
    class GetOne:
        def get_one(self, request, pk):
            query_set_obj = self.query_set_list.filter(pk=pk).first()
            if query_set_obj:
                data_serializer = self.ser(query_set_obj, many=False)
                response = {"status": 100, "message": "获取数据成功", "data": data_serializer.data}
                return Response(response)
            else:
                response = {"status": 100, "message": "该数据不存在", "data":""}
                return Response(response)
    
    #修改数据
    class Update:
        def update(self,request,pk):
            query_set_obj = self.query_set_list.filter(pk=pk).first()
            if query_set_obj:
                data_serializer = self.ser(instance=query_set_obj,data=request.data)
                if data_serializer.is_valid():
                    data_serializer.save()
                    response = {"status":100,"message":"数据修改成功","data":data_serializer.data}
                else:
                    response = {"status": 100, "message": data_serializer.errors, "data":""}
            else:
                response = {"status": 100, "message": "需要修改的数据不存在", "data": ""}
            return Response(response)
    
    #删除数据
    class Delete:
        def delete_by_id(self,request,pk):
            query_set_obj = self.query_set_list.filter(pk=pk).first()
            if query_set_obj:
                query_set_obj.delete()
                response = {"status": 100, "message": "数据删除成功", "data": ""}
            else:
                response = {"status": 100, "message": "需要删除的数据不存在", "data": ""}
            return Response(response)
    
    
    
    
    class BooksView(List, Create, APIView):
        query_set_list = models.Book.objects.all()
        ser = BookSerializers
    
        def get(self, request):
            return self.list(request)
    
        def post(self, request):
            return self.create(request)
    
    
    class BookView(GetOne,Update,Delete,APIView):
        query_set_list = models.Book.objects.all()
        ser = BookSerializers
    
        def get(self, request, pk):
            return self.get_one(request,pk)
    
        def put(self,request,pk):
            return self.update(request,pk)
    
        def delete(self,request,pk):
            return self.delete_by_id(request,pk)

      urls.py

    from app01.views import BooksView,BookView
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^Books/$', BooksView.as_view()),
        url(r'^Books/(?P<pk>d+)$', BookView.as_view()),
        ]

    三:restframework视图组件之mixin类和generice类编写视图

    本质就是上面的封装视图过程,在返回数据方面有一些不同。

     views.py

    from rest_framework.mixins import CreateModelMixin,UpdateModelMixin,ListModelMixin,DestroyModelMixin,RetrieveModelMixin
    from rest_framework.generics import GenericAPIView
    
    #查询所有数据和创建新数据的视图
    class BooksView(ListModelMixin,CreateModelMixin,GenericAPIView):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializers
        def get(self,request,*args,**kwargs):
            return self.list(request,*args,**kwargs)
    
        def post(self,request,*args,**kwargs):
            return self.create(request,*args,**kwargs)
    
    #查询单个数据、删除数据、修改数据的视图
    class BookView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializers
    
        def get(self,request,*args,**kwargs):
            return self.retrieve(request,*args,**kwargs)
    
        def put(self,request,*args,**kwargs):
            return self.update(request,*args,**kwargs)
    
        def delete(self,request,*args,**kwargs):
            return self.destroy(request,*args,**kwargs)

    四:restframework视图组件之使用generices下ListCreateAPIView,RetrieveUpdateDestroyAPIView编写视图

      views.py

    from rest_framework.generics import ListCreateAPIView,RetrieveUpdateDestroyAPIView
    
    class BooksView(ListCreateAPIView):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializers
    
    class BookView(RetrieveUpdateDestroyAPIView):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializers

    五:restframework视图组件之使用ModelViewSet编写视图

      views.py

    from rest_framework.viewsets import ModelViewSet
    
    class BooksView(ModelViewSet):
        queryset = models.Book.objects.all()
        serializer_class = BookSerializers

      urls.py

    from app01.views import BooksView
    
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        url(r'^Books/$', BooksView.as_view({"get":"list","post":"create"})),
        url(r'^Books/(?P<pk>d+)$', BooksView.as_view({"get":"retrieve","put":"update","delete":"destroy"})),
        ]
  • 相关阅读:
    日期获取以及时间转化
    ddt 接口框架数据处理调用excel 处理
    ddt 测试用例UI运用
    动态验证码处理UI自动化获取处理
    Bug Report For .Net (zz.IS2120@BG57IV3)
    中关村翠湖科技园:高端产业聚集区 (zz.IS2120@BG57IV3.T752270541 .K)
    vc6,windows 7 x64 调试 (IS2120@BG57IV3)
    Excel c#Excel文件的操作[转载]
    NUnit学习 标签、方法 记录与说明
    Excel c#Excel工作进程的创建写 与Excel文件的保存[原创] (20100205 11:09)
  • 原文地址:https://www.cnblogs.com/liuxiaolu/p/10637431.html
Copyright © 2011-2022 走看看