0
0
DjangoHow-ToBeginner · 4 min read

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 SearchFilter to filter_backends will disable search.
  • Not specifying search_fields means no fields are searched.
  • Using incorrect field names in search_fields causes 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 SearchFilter from rest_framework.filters.
  • Add SearchFilter to your view's filter_backends.
  • Define search_fields with model fields to enable search.
  • Use ?search=yourterm in 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.