A Django REST Framework library providing customizable pagination classes with rich metadata and flexible configuration options.
Rich Metadata: Get comprehensive pagination information including total pages, current page, and page size
Multiple Pagination Classes: Pre-configured classes for different use cases
Highly Customizable: Easy to customize page sizes and behavior
Client Control: Allow clients to specify page size via query parameters
Production Ready: Includes comprehensive test suite
Well Documented: Clear documentation and examples
Install using pip:
pip install easy_paginationOr install from source:
git clone https://github.com/digitaltouchcode/easy-pagination.git
cd easy-pagination
pip install -e .from rest_framework import viewsets
from easy_pagination import StandardPagination
class MyViewSet(viewsets.ModelViewSet):
queryset = MyModel.objects.all()
serializer_class = MySerializer
pagination_class = StandardPagination{
"count": 100,
"next": "http://api.example.com/items/?page=3",
"previous": "http://api.example.com/items/?page=1",
"total_pages": 10,
"current_page": 2,
"page_size": 10,
"results": [...]
}Default pagination for most list views.
- Default page size: 20 items
- Max page size: 100 items
- Best for: General purpose API endpoints
from easy_pagination import StandardPagination
class MyViewSet(viewsets.ModelViewSet):
pagination_class = StandardPaginationOptimized for small, quick-loading lists.
- Default page size: 10 items
- Max page size: 50 items
- Best for: Dropdown lists, autocomplete, quick searches
from easy_pagination import SmallResultsPagination
class QuickListViewSet(viewsets.ModelViewSet):
pagination_class = SmallResultsPaginationDesigned for large datasets and reports.
- Default page size: 50 items
- Max page size: 500 items
- Best for: Reports, data exports, admin interfaces
from easy_pagination import LargeResultsPagination
class ReportViewSet(viewsets.ModelViewSet):
pagination_class = LargeResultsPaginationDisable pagination for specific views.
- Returns: All results without pagination
- Best for: Small datasets, configuration endpoints
- Warning: Use carefully with large datasets!
from easy_pagination import NoPagination
class ConfigViewSet(viewsets.ModelViewSet):
pagination_class = NoPaginationCreate your own pagination class by extending CustomPageNumberPagination:
from easy_pagination import CustomPageNumberPagination
class MyCustomPagination(CustomPageNumberPagination):
page_size = 25
max_page_size = 200
page_size_query_param = 'page_size'Use the factory function to create pagination classes on the fly:
from easy_pagination import get_pagination_class
class MyViewSet(viewsets.ModelViewSet):
pagination_class = get_pagination_class(page_size=30, max_page_size=200)Clients can control page size using query parameters:
# Get 50 items per page
GET /api/items/?page_size=50
# Navigate to page 3
GET /api/items/?page=3
# Combine both
GET /api/items/?page=3&page_size=50Set a default pagination class for all views in your Django settings:
# settings.py
REST_FRAMEWORK = {
'DEFAULT_PAGINATION_CLASS': 'easy_pagination.StandardPagination',
'PAGE_SIZE': 20
}All pagination classes return responses with the following structure:
| Field | Type | Description |
|---|---|---|
count |
integer | Total number of items across all pages |
next |
string/null | URL to the next page (null if on last page) |
previous |
string/null | URL to the previous page (null if on first page) |
total_pages |
integer | Total number of pages |
current_page |
integer | Current page number (1-indexed) |
page_size |
integer | Number of items per page |
results |
array | Array of serialized objects for current page |
- Python >= 3.9
- Django >= 4.0
- djangorestframework >= 3.12
# Clone the repository
git clone https://github.com/digitaltouchcode/easy-pagination.git
cd easy-pagination
# Install in development mode
pip install -e ".[dev]"# Run all tests
pytest
# Run with coverage
pytest --cov=easy_pagination
# Run specific test file
pytest tests/test_pagination.py# Format code with black
black easy_pagination/
# Sort imports
isort easy_pagination/
# Lint with flake8
flake8 easy_pagination/Contributions are welcome! Please feel free to submit a Pull Request.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
This project is licensed under the MIT License - see the LICENSE file for details.
Casper
- Email: cassymyo@gmail.com
- GitHub: @casperspec-1
See CHANGELOG.md for a list of changes.
If you encounter any issues or have questions, please open an issue on GitHub.
Built with ❤️ using Django REST Framework.