Django REST Flameworkのよく使うページネーションPageNumberPagenationとLimitOffsetPagenationの違いについて公式ドキュメントを見てもよくわからないことが多いので、比較してまとめていきます。
公式ドキュメント:Pagination
レスポンスのかたち
レスポンスの形は両者共に同じで、以下のような構造で渡ってきます。
{
"count": 53,
"next": "http://api.example.com/resources/?page=3",
"previous": "http://api.example.com/resources/?page=1",
"results": [
{ "id": 11, "name": "..." },
{ "id": 12, "name": "..." }
]
}
違いはクエリパラメータ
PageNumberPagenationは?page=1が使える
PageNumberPagenationは、クエリパラメータにpage=を渡すことでページの指定ができます。
クラスパラメータは以下があり、継承して上書きして使えます。
- page_size: デフォルトの1ページ件数。None ならページング無効。
- page_query_param: ページ番号を指定するクエリパラメータ。デフォルトは "page"。
- page_size_query_param: ページサイズをクライアントが指定できるようにするかどうか。
- max_page_size: 最大取得件数
以上を使うと以下のようにpagenation_classを定義して使うことができます。
class MyPagination(PageNumberPagination):
page_size = 20 # デフォの所得件数
page_size_query_param = "page_size" # page_sizeのクエリパラメータで取得件数をクライアントサイドから変更可能
max_page_size = 100 # 取得件数の上限値
LimitOffsetPagenationは?limit=10&offset=20が使える
LimitOffsetPagenationは、その名の通りlimitと、offsetのクエリパラメータを指定することができます。
クエリパラメータで以下を指定できます。
- limit = 取得件数
- offset = 何件目から始めるか
たとえば、1ページ20件で、41件目から表示したいという場合は?limit=20&offset=41と表します。
PageNumberPagenationに比べると少し概念が複雑になりますが、1ページの件数を細かく指定することができるので便利で、しかもPageNumberPagenationよりも動作が軽いので大量にレコードがある時におすすめです。
クラスパラメータは以下があり、継承して上書きして使えます。
- default_limit: limit が指定されなかった場合のデフォルト件数
- limit_query_param / offset_query_param: クエリパラメータ名
- max_limit: クライアントが指定できる最大件数の上限。大きすぎるリクエストを制御できる
- templete: APIブラウザUIで利用されるだけのブラウザレンダリング時のページコントロール用テンプレート
以上を使うと以下のようにpagenation_classを定義して使うことができます。
class MyPagination(LimitOffsetPagination):
default_limit = 50 # デフォの所得件数
max_limit = 200 # 取得件数の上限値