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