-
Notifications
You must be signed in to change notification settings - Fork 109
Open
Description
What do you guys think about native support to pagination? We could implement that using Django paginator (for example) since it doesn't have external dependencies.
That's helpful in most listing APIs. Here is just an example on how it could be implemented in the Resource:
DEFAULT_RESULTS_PER_PAGE = 20
class Resource(object):
...
def serialize_list(self, data):
if getattr(self, 'paginate', False):
page_size = getattr(self, 'page_size', DEFAULT_RESULTS_PER_PAGE)
paginator = Paginator(data, page_size)
try:
page_number = int(self.request.GET.get('p', 1))
except ValueError:
page_number = None
if page_number not in paginator.page_range:
raise BadRequest('Invalid page number')
self.page = paginator.page(page_number)
data = self.page.object_list
return super().serialize_list(data)
def wrap_list_response(self, data):
response_dict = super().wrap_list_response(data)
if hasattr(self, 'page'):
if self.page.has_next():
next_page = self.page.next_page_number()
else:
next_page = None
if self.page.has_previous():
previous_page = self.page.previous_page_number()
else:
previous_page = None
response_dict['pagination'] = {
'num_pages': self.page.paginator.num_pages,
'count': self.page.paginator.count,
'page': self.page.number,
'start_index': self.page.start_index(),
'end_index': self.page.end_index(),
'next_page': next_page,
'previous_page': previous_page,
}
return response_dictAnd to use simply add to your resource:
MyResource(Resource):
paginate = True
page_size = 50 # optionalIf that seems useful I'm willing to create a PR with tests and docs.
Metadata
Metadata
Assignees
Labels
No labels