How to Implement Search in Django REST Framework (DRF)
To implement search in Django REST Framework (DRF), add
SearchFilter to your view's filter_backends and specify the fields to search with search_fields. This enables clients to filter API results by query parameters like ?search=keyword.Syntax
Use SearchFilter from rest_framework.filters in your view or viewset. Add it to filter_backends and define search_fields as a list of model fields to search.
filter_backends: List of filter classes to apply.SearchFilter: Enables search functionality.search_fields: Fields to search in, supports exact and partial matches.
python
from rest_framework import viewsets from rest_framework.filters import SearchFilter from myapp.models import Item from myapp.serializers import ItemSerializer class ItemViewSet(viewsets.ModelViewSet): queryset = Item.objects.all() serializer_class = ItemSerializer filter_backends = [SearchFilter] search_fields = ['name', 'description']
Example
This example shows a simple API viewset with search enabled on name and description fields. You can query the API with ?search=keyword to get filtered results.
python
from rest_framework import routers, serializers, viewsets from rest_framework.filters import SearchFilter from django.urls import path, include from django.db import models from django.contrib import admin from django.apps import AppConfig # Model class Item(models.Model): name = models.CharField(max_length=100) description = models.TextField() # Serializer class ItemSerializer(serializers.ModelSerializer): class Meta: model = Item fields = ['id', 'name', 'description'] # ViewSet class ItemViewSet(viewsets.ModelViewSet): queryset = Item.objects.all() serializer_class = ItemSerializer filter_backends = [SearchFilter] search_fields = ['name', 'description'] # Router router = routers.DefaultRouter() router.register(r'items', ItemViewSet) # URLs urlpatterns = [ path('admin/', admin.site.urls), path('api/', include(router.urls)), ] # App config class MyAppConfig(AppConfig): name = 'myapp'
Output
GET /api/items/?search=book
Response: JSON list of items where 'book' appears in name or description
Common Pitfalls
- Forgetting to add
SearchFiltertofilter_backendswill disable search. - Not specifying
search_fieldsmeans no fields are searched. - Using incorrect field names in
search_fieldscauses errors. - Search is case-insensitive and partial by default; expecting exact matches can confuse.
python
from rest_framework import viewsets from rest_framework.filters import SearchFilter class WrongViewSet(viewsets.ModelViewSet): # Missing SearchFilter in filter_backends filter_backends = [] search_fields = ['title'] # This will not work class CorrectViewSet(viewsets.ModelViewSet): filter_backends = [SearchFilter] search_fields = ['title'] # Correct usage
Quick Reference
Summary tips for implementing search in DRF:
- Import
SearchFilterfromrest_framework.filters. - Add
SearchFilterto your view'sfilter_backends. - Define
search_fieldswith model fields to enable search. - Use
?search=yourtermin API requests to filter results. - Supports partial and case-insensitive matching by default.
Key Takeaways
Add SearchFilter to filter_backends and define search_fields to enable search in DRF views.
Use ?search=keyword query parameter to filter API results by matching fields.
Ensure search_fields contains valid model field names to avoid errors.
Search is case-insensitive and partial by default, making it user-friendly.
Without SearchFilter in filter_backends, search functionality will not work.