Djangoroidの奮闘記

python,django,angularJS1~三十路過ぎたプログラマーの奮闘記

Django REST Frameworkに再挑戦 その7 Pagination with Rest Framework

概要

Django REST Frameworkに再挑戦 その7 Pagination with Rest Framework

参考サイト

www.django-rest-framework.org

www.codingforentrepreneurs.com

Pagination with Rest Framework(ページ付)

  • まずpaginationのclassを試しに、importする。api/views.py。
from rest_framework.pagination import (
    LimitOffsetPagination,
    PageNumberPagination,
    )
...
class PostListAPIView(ListAPIView):
...
    pagination_class = LimitOffsetPagination#PageNumberPagination
...
  • 上記のコードを追記して、http://127.0.0.1:8000/api/posts/?limit=2のように、limitを指定してアクセスすると、指定したら以下のように表示されるはず。
HTTP 200 OK
Allow: GET, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "count": 3,
    "next": "http://127.0.0.1:8000/api/posts/?limit=2&offset=2",
    "previous": null,
    "results": [
        {
            "user": 2,
            "title": "my title",
            "slug": "my-title",
            "content": "de",
            "publish": "2017-01-16"
        },
        {
            "user": 1,
            "title": "new title",
            "slug": "new-title",
            "content": "new item",
            "publish": "2017-01-13"
        }
    ]
}
  • custom paginationを作成する。まず、api/pagination.pyを作成する。ここでは、試しに、デフォルトが2で、表示のlimitが10のpagination classを作成する。公式サイトは以下を参照。

Pagination - Django REST framework

from rest_framework.pagination import (
    LimitOffsetPagination,
    PageNumberPagination,
    )


class PostLimitOffsetPagination(LimitOffsetPagination):
    default = 2
    max_limit = 10
  • api/views.pyのコードの修正をする。
from .pagination import PostLimitOffsetPagination
...
class PostListAPIView(ListAPIView):
...
    pagination_class = PostLimitOffsetPagination#PageNumberPagination
...
  • /api/posts/を開くと確かにpaginationできてる!!すげー!

  • 次は、PostPageNumberPaginationを定義してみる。pagination.pyに追記する。

class PostPageNumberPagination(PageNumberPagination):
    page_size = 2
  • api/views.pyに追記する。
...
from .pagination import PostLimitOffsetPagination, PostPageNumberPagination
...
class PostListAPIView(ListAPIView):
...
    pagination_class = PostPageNumberPagination#PageNumberPagination
...
  • おー、表示された!PageNumberPaginationは、1ページあたりのマックスの要素数を定義して、LimitOffsetは、リミットを決めておいて、それを超えたら次のページを表示させるという感じなのかな。