DRF(7)- 视图

本文详细介绍了 Django REST Framework(DRF)中的视图,包括APIView的request和Response用法,如何实现列表和详情视图,二级和三级视图的操作,以及ViewSet的使用。还探讨了如何利用Mixin增强视图功能,实现视图集的额外动作,并展示了partial更新的使用场景。
摘要由CSDN通过智能技术生成
1,APIView之request
  • 目的: 知道APIView的作用, 以及可以通过request获取请求参数
  • 作用:
    • 1, 继承自View
    • 2, 封装了自己的request,response
    • 3, 提供认证,限流,权限等功能
  • 获取参数:
    • request.query_params : 通过get请求提交的查询参数
    • request.data: 通过post提交的表单或者非表单获取数据方式
2,APIView之Response
  • 目的: 可以使用Response返回不同类型的数据,以及配合状态码使用
  • 作用:
    • 1, 不管响应的是文本还是json数据,全部都统一使用Response类
    • 2, 可以配合状态码使用, 见名知意
    • 3, 可以根据前端请求头中的Accept类型自动返回对应的数据
3,APIView实现列表视图
  • 目的: 可以使用APIView中的request和response, 以及序列化器实现列表视图

  • 操作流程:

    • 1, 子路由

      • url(r'^api_view_list/',views.BookListView.as_view()),
        
    • 2, 类视图

      • #3,使用一级视图, APIView 配合 序列化器 实现列表视图
        class BookListView(APIView):
            def get(self,request):
                #1,查询所有书籍
                books = BookInfo.objects.all()
        
                #2,数据转换
                serializer = BookInfoModelSerializer(instance=books,many=True)
        
                #3,返回响应,safe=False允许非字典返回
                return Response(serializer.data,status=status.HTTP_200_OK)
        
            def post(self,request):
                #1,获取参数
                dict_data = request.data
        
                #2,校验参数,入库
                serializer = BookInfoModelSerializer(data=dict_data)
                serializer.is_valid(raise_exception=True)
                serializer.save()
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_201_CREATED)
        
4,APIView实现详情视图
  • 目的: 可以使用APIView配合序列化器实现详情视图

  • 操作流程:

    • 1, 子路由

      • url(r'^api_view_detail/(?P<pk>\d+)/$',views.BookDetailView.as_view()),
        
    • 2, 类视图

      • #4,使用一级视图, APIView 配合 序列化器 实现详情视图
        class BookDetailView(APIView):
            def get(self,request,pk):
                #1,获取书籍
                book = BookInfo.objects.get(id=pk)
        
                #2,数据转换
                serializer = BookInfoModelSerializer(instance=book)
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_200_OK)
        
            def put(self,request,pk):
                #1,获取参数
                dict_data = request.data
                book = BookInfo.objects.get(id=pk)
        
                #2,校验参数,数据入库
                serializer = BookInfoModelSerializer(instance=book,data=dict_data)
                serializer.is_valid(raise_exception=True)
                serializer.save()
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_201_CREATED)
        
            def delete(self,request,pk):
                #1,获取数据
                book = BookInfo.objects.get(id=pk)
        
                #2,删除对象
                book.delete()
        
                #3,返回响应
                return Response({"errno":0,"errmsg":"删除成功"},status=status.HTTP_204_NO_CONTENT)
        
        
        
5,二级视图,实现列表视图
  • 目的: 知道二级视图创建的属性和方法, 以及能够实现列表视图

  • 操作流程:

    • 0,子路由

      • url(r'^generic_view/$',views.BookListGenericView.as_view()),
        
    • 1, 类视图

      • #5,二级视图GenericAPIView,实现列表视图
        """
        GenericAPIView特点:
        1, GenericAPIView,继承自APIView,为列表视图,详情视图添加了常用的方法和属性。
            属性:
                serializer_class: 指定通用的序列化器
                queryset: 指定通用的数据源
            
            方法:
                get_serializer: 获取序列化器
                get_queryset: 获取数据源
        
        
        2, GenericAPIView可以配合一个或多个mixin类使用。
        """
        class BookListGenericView(GenericAPIView):
        
            #1,给视图提供,常见(通用)的属性
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
            def get(self,request):
                #1,查询所有书籍
                # books = self.queryset.all()
                books = self.get_queryset() #和上面等价
        
                #2,数据转换
                # serializer = BookInfoModelSerializer(instance=books,many=True)
                # serializer = self.serializer_class(instance=books,many=True)
                serializer = self.get_serializer(instance=books,many=True) #和上面等价
        
                #3,返回响应,safe=False允许非字典返回
                return Response(serializer.data,status=status.HTTP_200_OK)
        
            def post(self,request):
                #1,获取参数
                dict_data = request.data
        
                #2,校验参数,入库
                # serializer = BookInfoModelSerializer(data=dict_data)
                # serializer = self.serializer_class(data=dict_data)
                serializer = self.get_serializer(data=dict_data) #和上面等价
                serializer.is_valid(raise_exception=True)
                serializer.save()
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_201_CREATED)
        
6,二级视图,实现详情视图
  • 目的: 可以通过二级视图GenericAPIView实现详情视图

  • 操作流程:

    • 1, 子路由

      • url(r'^generic_view/(?P<pk>\d+)/$',views.BookDetailGenericView.as_view()),
        
    • 2, 类视图

      • #6,二级视图GenericAPIView,实现详情视图
        class BookDetailGenericView(GenericAPIView):
        
            #1,给类视图中的方法,提供通用的属性
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
            def get(self,request,pk):
                #1,获取书籍
                # book = BookInfo.objects.get(id=pk)
                book = self.get_object() #和上面等价
        
                #2,数据转换
                serializer = BookInfoModelSerializer(instance=book)
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_200_OK)
        
            def put(self,request,pk):
                #1,获取参数
                dict_data = request.data
                # book = BookInfo.objects.get(id=pk)
                book = self.get_object()
        
                #2,校验参数,数据入库
                serializer = BookInfoModelSerializer(instance=book,data=dict_data)
                serializer.is_valid(raise_exception=True)
                serializer.save()
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_201_CREATED)
        
            def delete(self,request,pk):
                #1,获取数据
                # book = BookInfo.objects.get(id=pk)
                book = self.get_object()
        
                #2,删除对象
                book.delete()
        
                #3,返回响应
                return Response({"errno":0,"errmsg":"删除成功"},status=status.HTTP_204_NO_CONTENT)
        
7,get_object方法
  • 目的: 知道get_object的作用
  • 作用:
    • 根据lookup_field在数据源中获取一个对象
  • 二级视图属性,方法总结:
    • 属性:
      • serializer_class: 指定通用的序列化器
      • queryset: 指定通用的数据源
      • lookup_field: 给详情视图指定获取对象的参数
    • 方法:
      • get_seriariazer: 获取序列化器
      • get_queryset: 获取数据源
      • get_object: 根据lookup_field在数据源中获取一个对象
8,MiXin
  • 目的: 知道mixin的作用,以及常见的mixin类

  • 操作流程:

    • mixin 给列表视图,详情视图提供通用的功能 比如: get().post(), put()等等。这些方法操作可以随意组合。
      
      类名称                 方法          功能
      ListModelMixin        list         获取所有数据
      CreateModelMixin      create       创建单个对象
      RetrieveModelMixin    retrieve     获取单个对象
      UpdateModelMixin      update       更新单个对象
      DestroyModelMixin     destroy      删除单个对象
      
      
9,二级视图,MiXin配合使用
  • 目的: 可以通过二级视图GenericAPiView和mixin实现列表和详情视图

  • 列表视图操作流程:

    • 1, 子路由

      • url(r'^generic_mixin_view/$',views.BookListGenericMixinView.as_view())
        
    • 2, 类视图

      • #8,二级视图GenericAPIView + mixin实现列表视图
        class BookListGenericMixinView(ListModelMixin,CreateModelMixin,GenericAPIView):
        
            #1,给视图提供,常见(通用)的属性
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
            def get(self,request):
                return self.list(request)
        
            def post(self,request):
                return self.create(request)
        
        
  • 详情视图操作流程:

    • 1, 子路由

      • url(r'^generic_mixin_view/(?P<pk>\d+)/$',views.BookDetailGenericMixinView.as_view()),
        
    • 2, 类视图

      • #9,二级视图GenericAPIView + mixin实现详情视图
        class BookDetailGenericMixinView(RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin,GenericAPIView):
        
            #1,给类视图中的方法,提供通用的属性
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
            def get(self,request,pk):
                return self.retrieve(request)
        
            def put(self,request,pk):
                return self.update(request)
        
            def delete(self,request,pk):
                return self.destroy(request)
        
10,三级视图
  • 目的: 知道三级视图的作用, 以及常见的三级视图

  • 操作流程:

    • 三级视图特点: 是具体的通用视图。可以提供通用的行为,除非有特殊的行为, 那么才需要自定义。
      
      类名称             方法          父类                  作用
      CreateAPIView     post         GenericAPIView,      创建单个对象
                                     CreateModelMixin
                                     
      ListAPIView       get          GenericAPIView,      获取所有对象
                                     ListModelMixin   
                                     
      RetrieveAPIView   get          GenericAPIView,      获取单个对象
                                     RetrieveModelMixin                                                     
      
      DestroyAPIView    delete       GenericAPIView,      删除单个对象
                                     DestroyModelMixin
                                     
      UpdateAPIView     put          GenericAPIView,      更新单个对象
                                     UpdateModelMixin               
      
11,三级视图,实现列表,详情视图
  • 目的: 使用三级视图,实现列表,详情视图

  • 操作流程:

    • 1, 子路由

      •     url(r'^three_view/$',views.BookListThreeView.as_view()),
            url(r'^three_view/(?P<pk>\d+)/$',views.BookDetailThreeView.as_view()),
        
    • 2, 类视图

      • #11,三级视图,实现列表,详情视图
        class BookListThreeView(CreateAPIView,ListAPIView):
        
            #1,给视图提供,常见(通用)的属性
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
        class BookDetailThreeView(DestroyAPIView,UpdateAPIView,RetrieveAPIView):
        
            #1,给类视图中的方法,提供通用的属性
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
        
12,视图集
  • 目的:知道视图集的作用, 以及常见的视图集

  • 操作流程:

    • 特点: 
      1, 可以将多个操作组合在一起
      2, 可以进行路由映射
      
      类名称                 父类              作用
      ViewSet               APIView          可以进行路由映射
                            ViewSetMixin
                    
      GenericViewSet        GenericAPIView   可以进行路由映射       
                            ViewSetMixin
      
      ModelViewSet          GenericViewSet   可以进行路由映射,列表,详情视图功能
                            5个mixin类   
      
      ReadOnlyModelViewSet  GenericViewSet   可以进行路由映射,获取所有,获取单个
                            list,retrieve,mixin类
      
13,ViewSet
  • 目的: 知道如何使用viewSet将获取单个,和获取所有组合在一起

  • 操作流程:

    • 1,子路由

      •     url(r'^view_set/$',views.BookViewSet.as_view({'get': 'list'})),
            url(r'^view_set/(?P<pk>\d+)/$',views.BookViewSet.as_view({'get': 'retrieve'})),
        
    • 2,类视图

      • #13,ViewSet实现获取多个,单个数据
        from django.shortcuts import get_object_or_404
        from rest_framework import viewsets
        from rest_framework.response import Response
        
        class BookViewSet(viewsets.ViewSet):
            """
            A simple ViewSet for listing or retrieving users.
            """
            def list(self, request):
                queryset = BookInfo.objects.all()
                serializer = BookInfoModelSerializer(instance=queryset, many=True)
                return Response(serializer.data)
        
            def retrieve(self, request, pk=None):
                queryset = BookInfo.objects.all()
                book = get_object_or_404(queryset, pk=pk)
                serializer = BookInfoModelSerializer(book)
                return Response(serializer.data)
        
14,ReadOnlyModelViewSet
  • 目的: 可以使用该类实现获取所有,获取单个数据

  • 操作流程:

    • 1, 子路由

      •     url(r'^readonly_view_set/$', views.BookReadOnlyModelViewSet.as_view({'get': 'list'})),
            url(r'^readonly_view_set/(?P<pk>\d+)/$', views.BookReadOnlyModelViewSet.as_view({'get': 'retrieve'})),
        
    • 2, 类视图

      • #13,ReadOnlyModelViewSet实现获取所有,单个数据
        class BookReadOnlyModelViewSet(ReadOnlyModelViewSet):
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
        
15,ModelViewSet
  • 目的: 可以使用ModelViewSet实现列表,详情视图功能

  • 操作流程:

    • 1, 子路由

      •     url(r'^model_view_set/$', views.BookModelViewSet.as_view({'get': 'list','post':"create"})),
          
            url(r'^model_view_set/(?P<pk>\d+)/$', views.BookModelViewSet.as_view({'get': 'retrieve','put':"update",'delete':"destroy"})),
        
    • 2, 类视图

      • #14,ModelViewSet实现列表,详情视图功能
        class BookModelViewSet(ModelViewSet):
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
16,视图集额外动作
  • 目的: 可以在视图集中定义额外的方法,获取指定条件的数据

  • 操作流程:

    • 1, 子路由

      • url(r'^bread_grate_condition/$', views.BookModelViewSet.as_view({'get': 'get_bread'})),
        
    • 2, 类视图

      • #14,ModelViewSet实现列表,详情视图功能
        class BookModelViewSet(ModelViewSet):
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
            #1,获取阅读量大于等于20的书籍
            def get_bread(self,request):
        
                #1,查询书籍大于20的
                books = BookInfo.objects.filter(bread__gte=20).all()
        
                #2,数据转换
                serializer = self.get_serializer(instance=books,many=True)
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_200_OK)
        
        
  • 注意点:

    • 1, 给视图集添加额外的方法之后, 必须要使用映射形式才能访问
    • 2, 只有视图集能够进行路由映射,普通的1,2,3级视图不行
17,视图集额外动作,partial
  • 目的: 可以添加额外动作,更改指定书籍的阅读量

  • 操作流程:

    • 1, 子路由

      • url(r'^update_bread/(?P<pk>\d+)/$', views.BookModelViewSet.as_view({'put': 'update_bread'})),
        
    • 2,类视图

      • #14,ModelViewSet实现列表,详情视图功能
        class BookModelViewSet(ModelViewSet):
            serializer_class = BookInfoModelSerializer
            queryset = BookInfo.objects.all()
        
            ...
            
            #2,修改编号为10的书籍的阅读量为100
            def update_bread(self,request,pk):
                #1,获取书籍
                book = self.get_object()
                data = request.data
        
                #2,获取序列化器,校验,入库
                serializer = self.get_serializer(instance=book,data=data,partial=True)
                serializer.is_valid(raise_exception=True)
                serializer.save()
        
                #3,返回响应
                return Response(serializer.data,status=status.HTTP_201_CREATED)
        
  • 注意点:

    • 1, partial=True可以进行局部更新
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值