def pagination_factory(endpoint):
pg_cls_name = '{}Pagination'.format(endpoint.model.__name__)
page_size = getattr(endpoint, 'page_size', None)
pg_cls_attrs = {
'page_size': page_size if page_size is not None else settings.REST_FRAMEWORK.get('PAGE_SIZE', 50),
}
if hasattr(endpoint, 'pagination_template'):
pg_cls_attrs['template'] = endpoint.pagination_template
BasePagination = getattr(endpoint, 'base_pagination_class', pagination.PageNumberPagination)
if issubclass(BasePagination, pagination.PageNumberPagination):
pg_cls_attrs['page_size_query_param'] = getattr(endpoint, 'page_size_query_param', 'page_size')
for param in ('django_paginator_class', 'page_query_param', 'max_page_size', 'last_page_string',
'page_size'):
if getattr(endpoint, param, None) is not None:
pg_cls_attrs[param] = getattr(endpoint, param)
elif issubclass(BasePagination, pagination.LimitOffsetPagination):
pg_cls_attrs.pop('page_size')
for param in ('default_limit', 'limit_query_param', 'offset_query_param', 'max_limit'):
if getattr(endpoint, param, None) is not None:
pg_cls_attrs[param] = getattr(endpoint, param)
elif issubclass(BasePagination, pagination.CursorPagination):
for param in ('page_size', 'cursor_query_param', 'ordering'):
if getattr(endpoint, param, None) is not None:
pg_cls_attrs[param] = getattr(endpoint, param)
else:
raise ImproperlyConfigured('base_pagination_class needs to be a subclass of one of the following:'
'PageNumberPagination, LimitOffsetPagination, CursorPagination')
return type(pg_cls_name, (BasePagination, ), pg_cls_attrs)
评论列表
文章目录