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

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