Better filtering for Django REST Framework

0.11.1 · active · verified Fri Apr 17

djangorestframework-filters (DRF-Filters) provides a more powerful and flexible filtering solution for Django REST Framework. It extends `django-filter` to integrate seamlessly with DRF, offering features like related field filtering, method-based filtering, and lookup customization. The current stable version is 0.11.1, with active development on a future 1.0.0 release, while 0.x continues to receive maintenance updates.

Common errors

Warnings

Install

Imports

Quickstart

This quickstart demonstrates how to define `FilterSet` classes for models, including `RelatedFilter` for filtering across relationships, and integrate them with Django REST Framework's `ModelViewSet` using the `RestFrameworkFilterBackend`.

import os
from django.db import models
from rest_framework import serializers, viewsets
from rest_framework_filters import FilterSet, RelatedFilter
from rest_framework_filters.backends import RestFrameworkFilterBackend

# --- Minimal Django setup for demonstration (not for production) ---
# from django.conf import settings
# settings.configure(INSTALLED_APPS=['django.contrib.auth', 'django.contrib.contenttypes', 'rest_framework', 'rest_framework_filters'], DATABASES={'default': {'ENGINE': 'django.db.backends.sqlite3', 'NAME': ':memory:'}})
# import django
# django.setup()

# --- 1. Define your Models ---
class Author(models.Model):
    name = models.CharField(max_length=100)

    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=200)
    author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='books')
    published_year = models.IntegerField()

    def __str__(self):
        return f'{self.title} by {self.author.name}'

# --- 2. Define your FilterSet ---
class AuthorFilter(FilterSet):
    class Meta:
        model = Author
        fields = ['name']

class BookFilter(FilterSet):
    # Filter by author name (related field)
    author = RelatedFilter(AuthorFilter, field_name='author', queryset=Author.objects.all())
    
    class Meta:
        model = Book
        fields = {
            'title': ['iexact', 'icontains'],
            'published_year': ['exact', 'gte', 'lte'],
        }

# --- 3. Define your Serializers ---
class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = '__all__'

class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(read_only=True)
    class Meta:
        model = Book
        fields = '__all__'

# --- 4. Define your ViewSets with filter_backends ---
class BookViewSet(viewsets.ModelViewSet):
    queryset = Book.objects.all()
    serializer_class = BookSerializer
    filter_backends = (RestFrameworkFilterBackend,)
    filterset_class = BookFilter

class AuthorViewSet(viewsets.ModelViewSet):
    queryset = Author.objects.all()
    serializer_class = AuthorSerializer
    filter_backends = (RestFrameworkFilterBackend,)
    filterset_class = AuthorFilter

# Example usage (assuming Django/DRF setup):
# from rest_framework.test import APIClient
# client = APIClient()
# # Assuming you have data created, e.g., Author.objects.create(name='Jane Doe')
# # response = client.get('/books/?author__name=Jane') # This would work if DRF endpoints were configured.
# # print(response.data)

view raw JSON →