DjangoのRESTフレームワークの基本:ページング

DRFページング成分

なぜ使用のページング

私たちは、特定のテーブルのすべてのデータへのアクセス権を持っている場合、すべてのデータが表示されたら、テーブル内の我々のデータは、データの断片の数千を持っていることが、我々は、必要性にはほとんどありませんので、サービス側のデータメモリ圧力の大量大規模なネットワークの伝送時間のかかるプロセスが比較的大きくなりますがあります。

通常、私たちは要求されたデータの一部に行きたいと思う、である、私たちはしばしばページからページにデータを取得し、表示されていると言います。

使用ページャにDRF

ページングモード

残りのフレームワークは、3ページモードが用意されています。

rest_framework.paginationの輸入 PageNumberPagination、LimitOffsetPagination、CursorPagination

グローバルコンフィギュレーション

REST_FRAMEWORK = {
     ' DEFAULT_PAGINATION_CLASS '' rest_framework.pagination.LimitOffsetPagination ' ' PAGE_SIZE ':100 
}

ローカル設定

私たちの一部は、ビュークラスに配置されたことができます

クラスPublisherViewSet(ModelViewSet):
    クエリセット = models.Publisher.objects.all()
    serializer_class = PublisherModelSerializer
    pagination_class = PageNumberPagination   リストより注意(1ページのみモード)

DRFは、内蔵のページャ

PageNumberPagination

ページ番号、ページn、ページごとにm個のデータによるページ

たとえば、次のhttp://127.0.0.1:8000 / API /記事/ページ= 2&サイズ= 1?

ページャ

クラスMyPageNumber(PageNumberPagination):
    PAGE_SIZE = 2   どのように多くのページあたり 
    page_size_query_param = サイズ  #のページ番号のバーショーのURLのパラメータ 
    page_query_param = ページ  #のURLパラメータページで 
    MAX_PAGE_SIZE =なし   #の上限ページ数

ビュー

クラスArticleList(APIView):
     デフを取得(自己、要求、* argsを、** kwargsから):
        RES = { " コード" :0}
        article_list = models.Article.objects.all()。ORDER_BY(" ID " 分页 
        page_obj = MyPageNumber()
        page_article = page_obj.paginate_queryset(=クエリセット= article_list、要求=要求、ビュー自己)
        ser_obj = ArticleSerializer(page_article、多くの= 真)
        RES [ " データ" ] = ser_obj.data
         リターン応答(RES)

ページ番号のリンクを持つ応答を返します。

クラスArticleList(APIView):
     デフを取得(自己、要求、* argsを、** kwargsから):
        RES = { " コード" :0}
        article_list = models.Article.objects.all()。ORDER_BY(" ID " 分页 
        page_obj = MyPageNumber()
        page_article = page_obj.paginate_queryset(=クエリセット= article_list、要求=要求、ビュー自己)
        ser_obj = ArticleSerializer(page_article、多くの= 真)
        RES [ " データ" ] = ser_obj.data
         戻り page_obj.get_paginated_response(RES)

LimitOffsetPagination 

位置N、Mデータ背面図でタブ

たとえば、次のhttp://127.0.0.1:8000 / API /記事/オフセット= 2&リミット= 2?

ページャ

オフセットページネーション
クラスMyLimitOffset(LimitOffsetPagination):
    default_limit = 1 
    limit_query_param = ' 限界' 
    offset_query_param = ' オフセット' 
    max_limit = 999

ビュー

クラスArticleList(APIView):
     デフを取得(自己、要求、* argsを、** kwargsから):
        RES = { " コード" :0}
        article_list = models.Article.objects.all()。ORDER_BY(" ID " 分页 
        page_obj = MyLimitOffset()
        page_article = page_obj.paginate_queryset(=クエリセット= article_list、要求=要求、ビュー自己)
        ser_obj = ArticleSerializer(page_article、多くの= 真)
        RES [ " データ" ] = ser_obj.data
         戻り page_obj.get_paginated_response(RES)

CursorPagination

[暗号化]タブ、前回と次のid値を覚えておいてください

ページャ

暗号化ページング
クラスMyCursorPagination(CursorPagination):
    cursor_query_param = カーソル
    PAGE_SIZE = 1つの
    順序 = -id   書き換え可能なフィールドをソートします

ビュー

クラスArticleList(APIView):
     デフを取得(自己、要求、* argsを、** kwargsから):
        RES = { " コード" :0}
        article_list = models.Article.objects.all()。ORDER_BY(" ID " 分页 
        page_obj = MyCursorPagination()
        page_article = page_obj.paginate_queryset(=クエリセット= article_list、要求=要求、ビュー自己)
        ser_obj = ArticleSerializer(page_article、多くの= 真)
        RES [ " データ" ] = ser_obj.data
         リターン応答(RES)
        リターン page_obj.get_paginated_response(RES)

 

 

おすすめ

転載: www.cnblogs.com/huay/p/11887096.html