Pagination
Python-Rest-Framework provides classes for pagination. These classes are used directly in GetResponseMixin.
But they can be used independently for any purpose.
Classes themselves do not perform pagination, they only form the correct JSON, for the correct response to the client.
All Mixins can be found here:
from rest_framework.views.paginations import *
Paginator Classes
Full classes for pagination.
Paginators accept the data themselves in their constructor.
Then the .paginate() method is called, which accepts the arguments defined for the current Paginator. And this method returns a ready-made JSON.
Paginator consists of three methods: .get_paginate_data(), .get_objects_data(), .paginate()
.get_paginate_data()
Abstract Method This method adds information about the pagination itself. Must return a dictionary with data.
Signature: .get_paginate_data(*args, **kwargs) -> dict
args, kwargs- Your custom data for pagination.
.get_objects_data()
Abstract Method This method adds information on the objects themselves from the list. Must return a dictionary with data.
Signature: .get_objects_data() -> dict
.paginate()
This method generates complete JSON with data. Takes the same arguments as .get_paginate_data() and sends them to it. Must return a dictionary with data.
Signature: .paginate() -> dict
LimitOffsetResultPaginator
Paginator with limit,offset, count, result parameters.
Example:
from rest_framework.views.paginations import LimitOffsetResultPaginator
all_objects = list(range(100))
current_page = all_objects[:10]
result = LimitOffsetResultPaginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'result': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
LimitOffsetObjectsPaginator
Paginator with limit,offset, count, objects parameters.
Example:
from rest_framework.views.paginations import LimitOffsetObjectsPaginator
all_objects = list(range(100))
current_page = all_objects[:10]
result = LimitOffsetObjectsPaginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'objects': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
LimitOffsetItemsPaginator
Paginator with limit,offset, count, items parameters.
Example:
from rest_framework.views.paginations import LimitOffsetItemsPaginator
all_objects = list(range(100))
current_page = all_objects[:10]
result = LimitOffsetItemsPaginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'items': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
Paginator Mixins
Mixins for create Paginators.
LimitOffsetGetPaginateDataMixin
Mixin for added to result JSON limit, offset, count fields.
Example:
from rest_framework.views.paginations import BasePaginatorAbstract, LimitOffsetGetPaginateDataMixin
class Paginator(BasePaginatorAbstract, LimitOffsetGetPaginateDataMixin):
def get_objects_data(self):
returnĀ {'paginator': self.objects}
all_objects = list(range(100))
current_page = all_objects[:10]
result = Paginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'paginator': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
ResultGetObjectsDataPaginatorMixin
Mixin for added to result JSON result fields.
Example:
from rest_framework.views.paginations import BasePaginatorAbstract, ResultGetObjectsDataPaginatorMixin
class Paginator(BasePaginatorAbstract, ResultGetObjectsDataPaginatorMixin):
def get_paginate_data(self, limit=10, offset=0, count=None):
return dict(limit=limit, offset=offset, count=count)
all_objects = list(range(100))
current_page = all_objects[:10]
result = Paginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'result': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
ObjectsGetObjectsDataPaginatorMixin
Mixin for added to result JSON objects fields.
Example:
from rest_framework.views.paginations import BasePaginatorAbstract, ObjectsGetObjectsDataPaginatorMixin
class Paginator(BasePaginatorAbstract, ObjectsGetObjectsDataPaginatorMixin):
def get_paginate_data(self, limit=10, offset=0, count=None):
return dict(limit=limit, offset=offset, count=count)
all_objects = list(range(100))
current_page = all_objects[:10]
result = Paginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'objects': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
ItemsGetObjectsDataPaginatorMixin
Mixin for added to result JSON items fields.
Example:
from rest_framework.views.paginations import BasePaginatorAbstract, ItemsGetObjectsDataPaginatorMixin
class Paginator(BasePaginatorAbstract, ItemsGetObjectsDataPaginatorMixin):
def get_paginate_data(self, limit=10, offset=0, count=None):
return dict(limit=limit, offset=offset, count=count)
all_objects = list(range(100))
current_page = all_objects[:10]
result = Paginator(all_objects).paginate(limit=10, offset=0, count=100)
print(result)
# {'limit': 10, 'offset': 0, 'count': 100, 'items': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}
Writing custom Paginator
Inherit the rest_framework.views.paginations.BasePaginatorAbstract class and define the methods: .get_paginate_data(*args,**kwargs),.get_objects_data().
The very slice of objects is in self.objects.
Example:
from rest_framework.views.paginations import BasePaginatorAbstract
class MyPaginator(BasePaginatorAbstract):
def get_paginate_data(self, after=0, before=10, total=10):
return dict(after=after, total=total)
def get_objects_data(self):
return dict(object=self.objects)
all_objects = list(range(100))
current_page = all_objects[:10]
result = MyPaginator(all_objects).paginate(after=10, total=10)
print(result)
# {'after': 10, 'total': 10, 'objects': [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]}