LoginSignup
0
0

Django REST frameworkのAPI画面からcount, next, previousを消去したい

Posted at

問題背景

Django REST Framework(DRF)を使用してWebアプリを開発する際に,DRFのAPIからデータを取得して画面に表示したかったが,以下のようにAPI画面内にcount, next, previousが表示されていて,results内のデータを思うように取得できないことがありました.
image.png

DRFについて書かれている他のWebページでは,この3つは基本的に表示されていなかったので,データ取得の方法を真似しても上手くいかないものばかりでした.そこで,count, next, previousを消去する方法を調べて実践してみると,3つとも表示されなくなり,データも取得できたので,今回はそのメモ代わりとして記事を書きます.同じような状況にいる方々の助けになれば幸いです.

開発環境

  • python: 3.10.14
  • Django: 4.2

以下はディレクトリ構造

smart_django
├── app/
│   ├── ...
│   ├── template/
│   │   └── index.html
│   ├── admin.py
│   ├── models.py
│   ├── serializers.py
│   ├── urls.py
│   └── views.py
├── smart_django/
│   ├── ...
│   ├── asgi.py
│   ├── setting.py
│   ├── urls.py
│   └── wsgi.py
└── manage.py

解決方法

端的に言うと,DRFで元々定義されているget_paginated_responseメソッドをオーバーライドする必要があります.このメソッドはPaginationクラス内で以下のように定義されています.

class Pagination(pagination.PageNumberPagination):
    def get_paginated_response(self, data):
        return Response({
            'links': {
                'next': self.get_next_link(),
                'previous': self.get_previous_link()
            },
            'count': self.page.paginator.count,
            'results': data
        })

このメソッドをdataだけ返すようにオーバーライドしてあげると,results以外の項目が表示されなくなります.
具体的な方法としては,Django内の任意のファイル内(setting.pyと同じディレクトリ下だと後が楽かも)にget_paginated_responseを定義します.今回私はulrs.py内で以下のように定義しました.

ulrs.py
from rest_framework.response import Response
from rest_framework.pagination import PageNumberPagination

class PageNumberPaginationDataOnly(PageNumberPagination):
    def get_paginated_response(self, data):
        return Response(data)

そのあとは以下のようにsetting.py内のDEFAULT_PAGINATION_CLASSにオーバーライドを行なったファイルのパスを与えます.

setting.py
REST_FRAMEWORK = {
    'PAGE_SIZE' : 20,
    'DEFAULT_PAGINATION_CLASS': 'smart_django.urls.PageNumberPaginationDataOnly'
}

これで作業は完了です!API画面を確認してみると,results以外は表示されていない状態になっています.

image.png

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0