Django python rest frameworkでPaginationのためのカスタムクラスを作成する

前回、Pagination対応をしましたが、現状ですとデータを取り出す容量であるlimitに制限がないので、
制限を持たせるために、custom paginationクラスを作成し、apiに適応したいと思います。

custompaginationクラスを作成する

paginationを管理するための、
newFlowers/custompagination.pyファイルを作成してください。
そして以下のように書き込みます


from rest_framework.pagination import LimitOffsetPagination
class LimitOffsetPaginationWithUpperBound(LimitOffsetPagination):
    # limit最大量を指定
       max_limit = 4
    

settings.pyで指定したLimitOffsetPaginationクラスを継承して、limitの最大値を指定するmax_limitに4を代入します。

続いて、
このクラスをPagination設定に反映するために、restful01/restful01/settings.pyを以下のように変更します。


REST_FRAMEWORK = {
  'DEFAULT_PAGINATION_CLASS': 'flowers.custompagination.LimitOffsetPaginationWithUpperBound',
  'PAGE_SIZE': 2
}
    

DEFAULT_PAGINATION_CLASSに先ほど作ったLimitOffsetPaginationWithUpperBoundを指定しました。

apiを叩いて、limitに最大上限が適応されたか確認する

では、flower apiにlimit上限が適応されるか確かめてみます。


curl -iX GET "localhost:8000/flowers/?limit=5"

HTTP/1.1 200 OK
Date: Sun, 22 Jul 2018 03:44:24 GMT
Server: WSGIServer/0.2 CPython/3.6.4
Content-Type: application/json
Vary: Accept, Cookie
Allow: GET, POST, HEAD, OPTIONS
X-Frame-Options: SAMEORIGIN
Content-Length: 946

{"count":5,"next":"http://localhost:8000/flowers/?limit=4&offset=4","previous":null,"results":[
{"url":"http://localhost:8000/flowers/4","name":"blueLily","flower_category":"Liliaceae","production_date":"2018-08-20T02:02:00.716312Z","has_it_competed":false,"inserted_timestamp":"2018-07-22T02:07:24.939525Z"},
{"url":"http://localhost:8000/flowers/1","name":"newLily","flower_category":"Liliaceae","production_date":"2018-07-20T02:02:00.716312Z","has_it_competed":false,"inserted_timestamp":"2018-07-08T08:30:04.701664Z"},
{"url":"http://localhost:8000/flowers/3","name":"redLily","flower_category":"Liliaceae","production_date":"2018-08-20T02:02:00.716312Z","has_it_competed":false,"inserted_timestamp":"2018-07-22T02:07:08.190641Z"},
{"url":"http://localhost:8000/flowers/2","name":"tinyLily","flower_category":"Liliaceae","production_date":"2018-08-20T02:02:00.716312Z","has_it_competed":false,"inserted_timestamp":"2018-07-08T08:37:58.067468Z"}]}(MyRestfulApi)
    

limitクエリに5を指定しましたが、最大量である4件が返るようになりました。

Pagingの公式tutorialにその他の情報が掲載されています。

こちらを参考に、知識をまとめています。

初版:2018/7/22

このエントリーをはてなブックマークに追加