くらげになりたい。

くらげのようにふわふわ生きたい日曜プログラマなブログ。趣味の備忘録です。

DRFのページネーションクラスで今のpageとかを返すよう拡張する

DRFPageNumberPaginationを使ってると、
今のページ数(page)やページあたりの数(per_page)とかもほしくなる。

ドキュメントとかを見てると、カスタマイズで追加できるよ!と書いてあったので、
いろいろ試してみたときの備忘録。
Custom pagination styles

こんな感じ

DRFのPaginationの中で、DjangoPaginatorが使われていて、
self.pageには、Page classが入っているので、
そこからいろいろ取得して返せばOK。

# app/pagenation.py
from rest_framework import pagination
from rest_framework.response import Response


class CustomPageNumberPagination(pagination.PageNumberPagination):
  def get_paginated_response(self, data):
    return Response({
      'count': self.page.paginator.count,
      'page': self.page.number,
      'has_next': self.page.has_next(),
      'has_previous': self.page.has_previous(),
      'total_pages': self.page.paginator.num_pages,
      'per_page': self.page_size,
      'results': data
    })

カスタムしたクラスを有効化する

settings.pyの設定で、CustomPageNumberPaginationを利用するよう指定。

# settings.py
REST_FRAMEWORK = {
  'DEFAULT_PAGINATION_CLASS': 'app.pagination.CustomPageNumberPagination',
  # ...略
}

以上!!

参考にしたサイトさま