Django python rest frameworkでPagination対応をして、データの取り出す範囲を指定できるようにする
現状ですと、Flower Tableからdataを取り出す場合に、10000件のデータが入っている場合に、
10000件すべてのデータが返ってきてしまうので、データの取り出す範囲を指定できるように、pagination対応をしたいと思います。
rest frameworkにはpaginationをするための仕組みがあるので、それを利用します。
restful01/restful01/settings.pyを開いてください
settings.pyにpagination対応を書き込む
setting.pyに以下を追記します。
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS':'rest_framework.pagination.LimitOffsetPagination',
'PAGE_SIZE': 2
}
DEFAULT_PAGINATION_CLASSはpairになっており、rest_framework.pagination.LimitOffsetPaginationを指定しています。
LimistOffsetPaginationは制限とoffsetを含んだ形式のPaginationになります。
PAGE_SIZEに2を指定することで、最大閲覧数が2になります。
Paginationについては公式のtutorialがあります。
paginationを体感するためにflower tableをdataをinsertとする
dataが少なくpaginationを実感できないので、apiを叩いてnewflowers tableに新しいdataをinsertしましょう
curl -iX POST -H "Content-Type: application/json" -d '{"name":"redLily", "flower_category":"Liliaceae", "production_date": "2018-08-20T02:02:00.716312Z", "has_it_competed": "false"}' localhost:8000/flowers/
curl -iX POST -H "Content-Type: application/json" -d '{"name":"blueLily", "flower_category":"Liliaceae", "production_date": "2018-08-20T02:02:00.716312Z", "has_it_competed": "false"}' localhost:8000/flowers/
curl -iX POST -H "Content-Type: application/json" -d '{"name":"yellowLily", "flower_category":"Liliaceae", "production_date": "2018-08-20T02:02:00.716312Z", "has_it_competed": "false"}' localhost:8000/flowers/
flowers apiを叩いて、最大2つまでのデータを取得するように制限されるようになったか確認してみます。
curl -iX GET localhost:8000/flowers/
HTTP/1.1 200 OK
Date: Sun, 22 Jul 2018 02:17:13 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: 521
{"count":5,"next":"http://localhost:8000/flowers/?limit=2&offset=2","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"}]}
上記の通りなにも指定せずにapiを叩くと、limit=2&offset=2とクエリが入るようになり、
取得dataに制限が入るようになりました。
offsetや取得量などを指定したい場合は、offset・limitのクエリを指定します。
たとえば、最初から4件のデータを取得したい場合は、以下のようにコマンドを叩きます。
curl -iX GET "localhost:8000/flowers/?limit=4&offset=0"
HTTP/1.1 200 OK
Date: Sun, 22 Jul 2018 02:35:40 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"}]}
レスポンスの通りoffsetが0で4件のデータを取得することができました。
こちらを参考に、知識をまとめています。
初版:2018/7/22