• DRF之注册器、响应器、分页器


    一、url注册器

    通过DRF的视图组件,数据接口逻辑被我们优化到最剩下一个类,接下来,我们使用DRF的url控制器来帮助我们自动生成url,使用步骤如下:

    第一步:导入模块

    1
    from rest_framework import routers

    第二步:实例化一个router对象

    1
    router = routers.DefaultRouter()

    第三步:将需要自动生成url的接口注册到router中

    1
    router.register(r'books', views.BookView)

    第四步:生成url

    1
    2
    3
    urlpatterns = [
    re_path(r'^', include('router.urls')),
    ]
    注意:通过url注册器生成的url,会自动分发浏览发过来的get、post、put、delete请求,不需要我们再向as_view()方法中传{'get':'list','post':'create'}这样的参数

    二、响应器

    之前我们使用DRF的Response类来将数据响应给客户端,不管是POSTMAN还是浏览器,都能浏览到经过格式化后的漂亮的数据,DRF是怎么做的呢?其实就是通过响应器组件

    如果我们不需要使用DRF提供给浏览器的格式化后的数据,只需要禁止该响应方式即可:

    1
    2
    3
    4
    5
    6
    7
    8
    from rest_framework.renderers import JSONRenderer


    class BookView(ModelViewSet):
    renderer_classes = [JSONRenderer]
    throttle_classes = [RateThrottle]
    queryset = Book.objects.all()
    serializer_class = BookSerializer

    这样,浏览器再次访问,接收到的就是普通的json格式数据,而不是经过DRF格式化后的数据,renderer_classes的查找逻辑与之前的解析器等等组件是完全一样的。

    三、分页器

    为了服务器性能考虑,也为了用户体验,我们不应该一次将所有的数据从数据库中查询出来,返回给客户端浏览器,如果数据量非常大,这对于服务器来讲,可以说是性能灾难,而对于用户来讲,加载速度将会非常慢。

    所以,我们需要控制每次返回给客户端多少数据,这就需要用到分页器,接下来,我们一起来看看DRF的分页器组件。

    第一步:导入模块

    1
    from rest_framework.pagination import PageNumberPagination

    第二步:获取数据

    1
    books = Book.objects.all()

    第三步:创建分页器

    1
    paginator = PageNumberPagination()

    第四步:开始分页

    1
    paged_books = paginator.paginate_queryset(books, request)    #paged_books为每一页所对应的书籍列表,里面为一个个的书籍对象

    第五步:将分页后的数据进行序列化

    1
    serialized_data = BookSerializer(paged_books, many=True)

    第六步:返回数据

    1
    return Response(serialized_data.data)
    几个参数介绍
    • page_size:用来控制每页显示多少条数据(全局参数名为PAGE_SIZE,在settings里面配置,如下:);
    REST_FRAMEWORK = {
        "PAGE_SIZE": 4
    }
    • page_query_param:用来提供直接访问某页的数据;例如?page=3
    • page_size_query_param:临时调整当前显示多少条数据   例如?size=6
    • max_page_size:控制page_size_query_param参数能调整的最大条数

    自定义分页器------自定义的分页器需要继承PageNumberPagination

    1
    2
    3
    4
    5
    class MyPagination(PageNumberPagination):
    page_size = 2
    page_query_param = 'page'
    page_size_query_param = 'size'
    max_page_size = 5

    视图类:(继承APIView)

    class BookView(APIView):
        def get(self, request):
            books = Book.objects.all()
    
            paginater = MyPagination()
    
            paged_books = paginater.paginate_queryset(books, request)
            print('paged_books:',paged_books)  #每页所对应的书籍对象列表
    
            serialized_books = BookSerializer(paged_books, many=True)
    
            return Response(serialized_books.data)

    (继承ModelViewSet)

    class BookView(ModelViewSet):
        #指定分页器类
        pagination_class = MyPagination
       
        queryset = Book.objects.all()
        serializer_class = BookSerializer
  • 相关阅读:
    Word批量转PDF或者图片
    sqlite3数据c/c++接口编程<linux,window>
    静态库和动态库
    QT信号和槽
    C程序编译过程
    Volatile关键字
    端口复用setsockopt
    深入理解epoll(转载)
    临时变量
    json学习随笔
  • 原文地址:https://www.cnblogs.com/fengchong/p/10104747.html
Copyright © 2020-2023  润新知