Охватываемые темы: Simple Filtering via Query Params, django-filter, Search and Ordering, filterset_fields — Quick Setup.
Simple Filtering via Query Params
class TaskViewSet(viewsets.ModelViewSet):
serializer_class = TaskSerializer
def get_queryset(self):
qs = Task.objects.filter(owner=self.request.user)
status = self.request.query_params.get('status')
priority = self.request.query_params.get('priority')
if status:
qs = qs.filter(status=status)
if priority:
qs = qs.filter(priority=priority)
return qs
django-filter
pip install django-filter
# settings.py
INSTALLED_APPS = [..., 'django_filters']
REST_FRAMEWORK = {
'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
}
import django_filters
class TaskFilter(django_filters.FilterSet):
status = django_filters.CharFilter()
priority = django_filters.NumberFilter()
due_before = django_filters.DateFilter(field_name='due_date', lookup_expr='lte')
due_after = django_filters.DateFilter(field_name='due_date', lookup_expr='gte')
title = django_filters.CharFilter(lookup_expr='icontains')
class Meta:
model = Task
fields = ['status', 'priority', 'project']
class TaskViewSet(viewsets.ModelViewSet):
filterset_class = TaskFilter
Search and Ordering
from rest_framework.filters import SearchFilter, OrderingFilter
class TaskViewSet(viewsets.ModelViewSet):
filter_backends = [
DjangoFilterBackend,
SearchFilter,
OrderingFilter,
]
filterset_class = TaskFilter
search_fields = ['title', 'description', 'owner__username']
ordering_fields = ['created_at', 'priority', 'due_date']
ordering = ['-created_at'] # default ordering
# Example requests
GET /api/tasks/?status=todo&priority=3
GET /api/tasks/?search=important
GET /api/tasks/?ordering=-priority
GET /api/tasks/?due_before=2024-12-31
filterset_fields — Quick Setup
class TaskViewSet(viewsets.ModelViewSet):
filterset_fields = ['status', 'priority', 'project', 'owner']
# Exact match only (=)
💬 Comments (0)
No comments yet
Be the first to share your opinion about this article!