django-filter는 Django ORM에서 제공하는 강력한 쿼리 기능을 URL 쿼리 파라미터와 연결시켜주는 도구.
예:
GET /products/?min_price=1000&max_price=5000
이 요청을 처리하여 내부적으로
Product.objects.filter(price__gte=1000, price__lte=5000)
이런 ORM 쿼리로 바꿔줌
filter_backends는 Django REST Framework (DRF)에서 리스트 API 결과를 어떻게 필터링, 검색, 정렬할지를 정의하는 설정
DjangoFilterBackend는 django-filter 패키지를 기반으로 작동하는 필터링 백엔드
from django_filters.rest_framework import DjangoFilterBackend
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend] # 🔸 이 부분
filterset_class = ProductFilter
클라이언트가 쿼리 파라미터로 요청을 보냄:
GET /api/products/?min_price=1000&category=electronics
filter_backends에 DjangoFilterBackend가 등록되어 있으면:
| filter_backends 요소 | 설명 |
|---|---|
DjangoFilterBackend | django-filter 기반의 정교한 필터링 지원 |
SearchFilter | 키워드 검색 기능 (search_fields 필요) |
OrderingFilter | 결과 정렬 기능 (ordering_fields 필요) |
# 필터셋 정의
class ProductFilter(FilterSet):
min_price = NumberFilter(field_name='price', lookup_expr='gte')
max_price = NumberFilter(field_name='price', lookup_expr='lte')
class Meta:
model = Product
fields = ['min_price', 'max_price']
# ViewSet 정의
class ProductViewSet(viewsets.ModelViewSet):
queryset = Product.objects.all()
serializer_class = ProductSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = ProductFilter
GET /api/products/?min_price=1000&max_price=3000
👉 내부적으로 실행되는 쿼리:
Product.objects.filter(price__gte=1000, price__lte=3000)