Easy CRUD operations for Django REST Framework.
Project description
DRF Easy CRUD
Enterprise-grade utility library for simplifying CRUD operations in Django REST Framework. Provides powerful filtering, pagination, and standardized CRUD methods to accelerate API development.
Installation
uv add drf-easy-crud
Features
- 🔧 Simplified CRUD Operations: Static utility methods for GET, POST, PUT, PATCH, and DELETE operations
- 🔍 Advanced Filtering: Wildcard pattern matching for text fields, comparison operators for numeric fields
- 📄 Built-in Pagination: Standard pagination with configurable page sizes
- 🔗 ForeignKey Support: Filter across related models using Django's double-underscore lookup syntax
- 🛡️ Enterprise-Grade Error Handling: Comprehensive error handling with detailed logging
- 📊 Type-Safe: Full type hints for better IDE support and code reliability
- ⚡ Performance Optimized: Efficient queryset handling with optional hooks for customization
Quick Start
Basic Usage
from rest_framework import viewsets
from rest_framework.request import Request
from rest_framework.response import Response
from drf_easy_crud import CRUDUtils
from myapp.models import MyModel
from myapp.serializers import MyModelSerializer
class MyModelViewSet(viewsets.ViewSet):
"""Example ViewSet using CRUDUtils."""
def get(self, request: Request, pk: int | None = None) -> Response:
"""List all instances or retrieve a single one by pk."""
return CRUDUtils.get(
request=request,
queryset=MyModel,
serializer_class=MyModelSerializer,
pk=pk,
)
def post(self, request: Request) -> Response:
"""Create a new instance."""
return CRUDUtils.post(
request=request,
serializer_class=MyModelSerializer,
)
def put(self, request: Request, pk: int) -> Response:
"""Full update of an instance."""
return CRUDUtils.put(
request=request,
queryset=MyModel,
serializer_class=MyModelSerializer,
pk=pk,
)
def patch(self, request: Request, pk: int) -> Response:
"""Partial update of an instance."""
return CRUDUtils.patch(
request=request,
queryset=MyModel,
serializer_class=MyModelSerializer,
pk=pk,
)
def delete(self, request: Request, pk: int) -> Response:
"""Delete an instance."""
return CRUDUtils.delete(
request=request,
queryset=MyModel,
pk=pk,
)
Advanced Features
Pre-scoped Querysets
Pass a pre-filtered queryset instead of a model class for full control:
def list(self, request: Request) -> Response:
"""List only active instances belonging to the current user."""
return CRUDUtils.get(
request=request,
queryset=MyModel.objects.filter(is_active=True, owner=request.user),
serializer_class=MyModelSerializer,
)
Custom Pagination
Use your own pagination class:
from drf_easy_crud import CRUDUtils, StandardResultsSetPagination
from rest_framework.pagination import PageNumberPagination
class CustomPagination(PageNumberPagination):
page_size = 50
max_page_size = 200
def list(self, request: Request) -> Response:
return CRUDUtils.get(
request=request,
queryset=MyModel,
serializer_class=MyModelSerializer,
pagination_class=CustomPagination,
)
Custom Ordering
Specify default ordering for list endpoints:
def list(self, request: Request) -> Response:
return CRUDUtils.get(
request=request,
queryset=MyModel,
serializer_class=MyModelSerializer,
ordering_field="-created_at", # Newest first
)
Filtering
The library provides powerful filtering capabilities through FilterUtils:
Text Field Wildcard Patterns
| Pattern | Description | Example | Matches |
|---|---|---|---|
field=value* |
Starts with | ?name=test* |
"test", "test123", "testing" |
field=*value |
Ends with | ?name=*test |
"mytest", "123test" |
field=*value* |
Contains | ?name=*test* |
"test", "mytest", "testing" |
field=va*ue |
Middle wildcard | ?name=t*t |
"test", "tart", "t123t" |
field=value |
Exact match | ?name=test |
"test" (case-insensitive) |
Number Field Comparison Operators
| Pattern | Description | Example | Matches |
|---|---|---|---|
field=value |
Exact match | ?age=25 |
Exactly 25 |
field=>=value |
Greater than or equal | ?age=>=25 |
25, 26, 27, ... |
field=<=value |
Less than or equal | ?age=<=100 |
..., 98, 99, 100 |
field=>value |
Greater than | ?age=>25 |
26, 27, 28, ... |
field=<value |
Less than | ?age=<25 |
..., 23, 24 |
ForeignKey Lookups
Filter by related model fields using double underscores:
# Filter by related model's text field
GET /api/products/?category__name=electronics*
# Filter by related model's number field
GET /api/products/?category__priority=>=5
# Nested ForeignKey lookup
GET /api/orders/?customer__company__name=acme*
Filtering Examples
# Search by name starting with "test"
GET /api/mymodel/?name=test*
# Search by name containing "important"
GET /api/mymodel/?name=*important*
# Filter by age >= 18
GET /api/mymodel/?age=>=18
# Filter by age between 18 and 30
GET /api/mymodel/?age=18-30
# Multiple filters combined
GET /api/mymodel/?name=test*&age=>=18&status=active
# ForeignKey lookup
GET /api/mymodel/?category__name=electronics*
Pagination
Results are paginated by default (20 items per page, max 100).
Pagination Parameters
page- Page number (default: 1)page_size- Items per page (default: 20, max: 100)
Paginated Response Format
{
"count": 150,
"next": "http://example.com/api/mymodel/?page=2",
"previous": null,
"results": [
{
"id": 1,
"name": "Item 1",
...
},
...
]
}
🤝 Contributing
If you have a helpful tool, pattern, or improvement to suggest:
Fork the repo
Create a new branch
Submit a pull request
I welcome additions that promote clean, productive, and maintainable development.
🙏 Thanks
Thanks for exploring this repository!
Happy coding!
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file drf_easy_crud-2.1.0.tar.gz.
File metadata
- Download URL: drf_easy_crud-2.1.0.tar.gz
- Upload date:
- Size: 18.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7fbcad848f352d79348b9ab6a6d8542892371ecb2ea0d7d9a2535b0d725edafe
|
|
| MD5 |
35e66f88222383bef442c7200fb22bc6
|
|
| BLAKE2b-256 |
cf082e01b9509fa59a25e469f799ee28ab63c7561d88894d5edb53faeebaf0fe
|
File details
Details for the file drf_easy_crud-2.1.0-py3-none-any.whl.
File metadata
- Download URL: drf_easy_crud-2.1.0-py3-none-any.whl
- Upload date:
- Size: 19.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
802284c1a123280d335b5a232e53e777891d54a9d39bfd81501853a73fd75c5a
|
|
| MD5 |
d86961fa4aa8e0a87b08870696fe2180
|
|
| BLAKE2b-256 |
efa023c59af66b2cf948cfba65f58e1c2554fcc6c16b5bca3d938bed234e9e7d
|