Django Filter

django-filter предоставляет декларативный способ фильтрации Django QuerySets.

Установка

1# Установка пакета
2pip install django-filter
1# Или через Poetry
2poetry add django-filter

Создание фильтров

 1import django_filters
 2from .models import Book
 3
 4class BookFilter(django_filters.FilterSet):
 5    title = django_filters.CharFilter(lookup_expr='icontains')
 6    published_after = django_filters.DateFilter(field_name='published_date', lookup_expr='gte')
 7    price_min = django_filters.NumberFilter(field_name='price', lookup_expr='gte')
 8    price_max = django_filters.NumberFilter(field_name='price', lookup_expr='lte')
 9
10    class Meta:
11        model = Book
12        fields = ['author', 'category']

Использование во views

1from django_filters.views import FilterView
2
3class BookListView(FilterView):
4    model = Book
5    filterset_class = BookFilter
6    template_name = 'books/list.html'

Интеграция с DRF

1from django_filters.rest_framework import DjangoFilterBackend
2
3class BookViewSet(viewsets.ModelViewSet):
4    queryset = Book.objects.all()
5    filter_backends = [DjangoFilterBackend]
6    filterset_class = BookFilter

Кастомные фильтры

1class BookFilter(django_filters.FilterSet):
2    author_name = django_filters.CharFilter(method='filter_author_name')
3
4    def filter_author_name(self, queryset, name, value):
5        return queryset.filter(author__name__icontains=value)
6
7    class Meta:
8        model = Book
9        fields = ['title', 'author_name']

FAQ

Q: Как создать сложные фильтры?
A: Используй method parameter для кастомной логики фильтрации.

Q: Можно ли фильтровать по связанным полям?
A: Да, используй двойное подчеркивание: author__name__icontains.