참고 - 장고 필터의 이해(django-filter)

JungSik Heo·2025년 5월 11일

🔷 1. django-filter란?

django-filter는 Django ORM에서 제공하는 강력한 쿼리 기능을 URL 쿼리 파라미터와 연결시켜주는 도구.

예:
GET /products/?min_price=1000&max_price=5000

이 요청을 처리하여 내부적으로

Product.objects.filter(price__gte=1000, price__lte=5000)
이런 ORM 쿼리로 바꿔줌

2.DjangoFilterBackend 의 이해

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

3.🔧 동작 방식

클라이언트가 쿼리 파라미터로 요청을 보냄:

GET /api/products/?min_price=1000&category=electronics
filter_backends에 DjangoFilterBackend가 등록되어 있으면:

  • 요청을 가로채서 필터셋(filterset_class)을 확인
  • 필터셋에서 정의된 필드와 비교해 유효한 필터만 추출
  • 이를 Django ORM 쿼리로 변환하여 queryset에 적용
  • 최종적으로 필터링된 결과가 반환

4.filter_backends의 다양한 옵션들

filter_backends 요소설명
DjangoFilterBackenddjango-filter 기반의 정교한 필터링 지원
SearchFilter키워드 검색 기능 (search_fields 필요)
OrderingFilter결과 정렬 기능 (ordering_fields 필요)

5. 예시: 전체 흐름

# 필터셋 정의
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)
profile
쿵스보이(얼짱뮤지션)

0개의 댓글