zoukankan      html  css  js  c++  java
  • DRF中的视图集的使用

    1、说明:DRF框架中的视图集:

      在drf开发接口中,使用GenericAPIView和视图扩展类结合起来完成接口功能是一件很常见的事情,
    所以,drf的作者帮我们提前把  GenericAPIView和视图扩展类结合子类也声明了出来
    视图子类中还帮我们定义对应接口的视图方法代码,所以我们无需在视图中重复编写对用的视图方法了。
    案例代码:

    view.py

    from rest_framework.generics import ListAPIView,CreateAPIView # ListAPIView是 GernericAPIView和ListModelMixin的组合子类
    class BookInfoSonAPIView(ListAPIView,CreateAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoModelSerializer
    
    # from rest_framework.generics import RetrieveAPIView,UpdateAPIView,DestroyAPIView
    from rest_framework.generics import RetrieveUpdateDestroyAPIView # 等同于上面同时引入的三个视图子类
    class BookInfo2SonAPIView(RetrieveUpdateDestroyAPIView):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoModelSerializer

    urls.py

     # urls.py
     
       path("books4/", views.BookInfoSonAPIView.as_view()),
        re_path("books4/(?P<pk>d+)/", views.BookInfo2SonAPIView.as_view()),
     

     2:ViewSet视图集的使用


    #继承使用ListAPIView,CreateAPIView,虽然方便,但是明显可以看到,类属性重复了,
    # 如果把两个类的视图都放在一个类下,那么就只能实现一个类视图对应一个http请求的情况
    # 所以drf中提供了视图集帮助我们改变路由和视图方法的绑定关系来解决,即是,通过在视图函数中
    # 来自定义自己写的函数,然后再在路由中改变绑定关系。使其对应不同的http请求


    #views.py
    from rest_framework.viewsets import ViewSet
    from booktest.models import BookInfo
    from app01.serializers import BookInfoModelSerializer
    from rest_framework.response import Response
    class BookInfoAPIViewSet(ViewSet):
        def get_list(self,request): # 获取所有数据
            # 三步走:
            # 第一步:操作数据
            books=BookInfo.objects.all()
            # 第二步:序列化
            serializer=BookInfoModelSerializer(instance=books,many=True)
            # 第三步:响应数据
            return Response(serializer.data)
    
        # 获取一条数据
        def get_one(self,request,pk):
            # 三步骤
            # 第一步:操作数据库
            book=BookInfo.objects.get(pk=pk)
            # 第二步:序列化
            serializer=BookInfoModelSerializer(instance=book)
            # 第三步:响应信息
            return Response(serializer.data)
    
        # 获取前五条数据
        def get_top5(self,request):
            # 三步骤
            # 第一步:操作数据
            books=BookInfo.objects.order_by("-bread")[:5] # 依据阅读数量查询数据
            # 第二步:序列化
            serializer=BookInfoModelSerializer(instance=books,many=True)
            # 第三步:响应信息
            return Response(serializer.data)

    urls.py

    from django.urls import path,re_path
    from . import views
    
    urlpatterns=[
    # 获取所有数据要走的路由
        path("book04/",views.BookInfoAPIViewSet.as_view({"get":"get_list"})),
    
        #获取一条数据
        re_path("book05/(?P<pk>d+)/", views.BookInfoAPIViewSet.as_view({"get":"get_one"})),
    
        # 查询前五条数据
        path("book06/top5/", views.BookInfoAPIViewSet.as_view({"get": "get_top5"})),
    
    ]

     3、GenericViewSet的使用


    # 使用ViewSet通常并不方便,因为listretrievecreateupdatedestory等方法都需要自己编写,而这些方法与前面讲过的Mixin扩展类提供的方法同名,
    # 所以我们可以通过继承Mixin扩展类来复用这些方法而无需自己编写。但是Mixin扩展类依赖与`GenericAPIView`,所以还需要继承`GenericAPIView`
    # **GenericViewSet**就帮助我们完成了这样的继承工作,继承自`GenericAPIView``ViewSetMixin`,在实现了调用as_view()时传入字典
    # (如`{'get':'list'}`)的映射处理工作的同时,还提供了`GenericAPIView`提供的基础方法,可以直接搭配Mixin扩展类使用。


    views.py
    """上面的代码又回到了最初的APIView时代,所以我们可以使用GenericViewSet来简化"""
    from rest_framework.viewsets import GenericViewSet
    from booktest.models import BookInfo
    from app01.serializers import BookInfoModelSerializer
    from rest_framework.response import Response
    from rest_framework.mixins import ListModelMixin,RetrieveModelMixin
    class BookInfoGenericViewSet(GenericViewSet,ListModelMixin,RetrieveModelMixin):
        # GenericViewSet 继承了GnericAPIView 所以必须要有以下两个参数
        queryset = BookInfo.objects.all() # 指明当前操作的模型数据是什么,
        serializer_class = BookInfoModelSerializer # 指明用的是什么序列化器
    
        def get_list(self,request):
            # 获取所有数据
            return self.list(request)  # 当前类的方法list,继承了GenricAPIVIew
    
        def get_one(self,request,pk):
            # 获取一条数据
            return self.retrieve(request,pk)

    urls.py

    from django.urls import path,re_path
    from . import views
    
    urlpatterns=[
    # 查询所有数据
        path("book07/", views.BookInfoGenericViewSet.as_view({"get": "get_list"})),
        # 查询一条数据
        re_path("book07/(?P<pk>d+)/", views.BookInfoGenericViewSet.as_view({"get": "get_one"})),
    
    ]

    4、ModelViewSet的使用

    继承自GenericViewSet,同时包括了ListModelMixin、RetrieveModelMixin、CreateModelMixin、UpdateModelMixin、DestoryModelMixin。

    """对于上面虽然虽然已经简化了很多代码,但是drf中针对常用的5个接口,事实上有提供了预设类给我们直接使用"""
    from rest_framework.viewsets import ModelViewSet,ReadOnlyModelViewSet
    from booktest.models import BookInfo
    from .serializers import BookInfoModelSerializer
    from rest_framework.response import Response
    class BookInfoModelViewSet(ModelViewSet):
        queryset = BookInfo.objects.all()
        serializer_class = BookInfoModelSerializer
    
        def get_top_5(self,request):
            """获取评论值最多的5条数据"""
            # 操作数据库
            print(self.action) # 获取本次请求的视图方法名
            books = BookInfo.objects.order_by("-bread")[:5]
            # 序列化
            serializer = BookInfoModelSerializer(instance=books,many=True)
            # 3, 响应数据
            return Response(serializer.data)

    urls.py

    from django.urls import path, re_path
    from . import views
    urlpatterns = [
        # 针对ModelViewSet提供的5个视图方法,路由以下:
    
      # 针对ModelViewSet提供的5个视图方法,路由以下:
    path("books08/", views.BookInfoModelViewSet.as_view({"get":"list"})),
    path("books08/", views.BookInfoModelViewSet.as_view({"post":"create"})),
    path("books08/top5/", views.BookInfoModelViewSet.as_view({"get":"get_top_5"})),
    re_path("books08(?P<pk>d+)/", views.BookInfoModelViewSet.as_view({"get":"retrieve"})),
    re_path("books08(?P<pk>d+)/", views.BookInfoModelViewSet.as_view({"put":"update"})),
    re_path("books08/(?P<pk>d+)/", views.BookInfoModelViewSet.as_view({"delete":"destroy"})),
    ]


  • 相关阅读:
    MyBatis:2
    MyBatis:1
    synchronized锁普通方法和锁静态方法
    打印倒直角三角形
    迭代器模拟for循环
    Python迭代对象与迭代器
    ffmpeg用法(心得体会还有你见过的用法)
    ffmpeg命令选项解释
    ffmpeg一些filter用法、以及一些功能命令
    FFMPEG 实现 YUV,RGB各种图像原始数据之间的转换(swscale)
  • 原文地址:https://www.cnblogs.com/one-tom/p/11347101.html
Copyright © 2011-2022 走看看