問題背景
Django REST Framework(DRF)を使用してWebアプリを開発する際に,DRFのAPIからデータを取得して画面に表示したかったが,以下のようにAPI画面内にcount
, next
, previous
が表示されていて,results
内のデータを思うように取得できないことがありました.
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
内で以下のように定義しました.
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
にオーバーライドを行なったファイルのパスを与えます.
REST_FRAMEWORK = {
'PAGE_SIZE' : 20,
'DEFAULT_PAGINATION_CLASS': 'smart_django.urls.PageNumberPaginationDataOnly'
}
これで作業は完了です!API画面を確認してみると,results
以外は表示されていない状態になっています.
参考資料