[python] Django REST framework에서의 필터링과 정렬

Django REST framework은 Django 프레임워크를 통해 웹 API를 빌드하고 제공하는데 사용되는 강력한 도구입니다. 이 프레임워크는 데이터 필터링 및 정렬 기능을 제공하여 사용자가 API 결과를 원하는 방식으로 조회 및 정렬할 수 있도록 도와줍니다.

필터링

Django REST framework에서의 필터링은 주어진 조건에 부합하는 결과만을 반환하는 기능입니다. 이를 통해 사용자는 API 결과를 원하는 방식으로 제한할 수 있습니다.

Query Parameters를 이용한 필터링

가장 간단한 필터링 방법은 query parameters를 사용하는 것입니다. 사용자는 URL에 query parameters를 추가하여 원하는 조건을 지정하고, 서버는 해당 조건에 맞는 결과만을 반환합니다.

예를 들어, /products?category=electronics&price__lte=100와 같은 URL은 “electronics” 카테고리의 제품 중 가격이 100 이하인 제품들만을 반환하도록 필터링할 수 있습니다.

Django ORM을 이용한 필터링

Django REST framework은 Django의 ORM을 기반으로 하기 때문에, ORM을 사용하여 좀 더 복잡한 필터링도 가능합니다. ORM을 사용하면 여러 필드나 연산자를 조합해서 원하는 조건을 만들 수 있습니다.

예를 들어, 아래와 같은 Django ORM 쿼리를 사용하여 필터링할 수 있습니다:

from django.db.models import Q

Product.objects.filter(Q(category='electronics') & Q(price__lte=100))

이렇게 함께 사용하는 Q 객체를 이용하면 여러 개의 필터 조건을 조합할 수 있습니다.

정렬

Django REST framework를 사용하면 API 결과를 원하는 순서로 정렬할 수 있습니다. 정렬은 결과를 사용자에게 더 유용하고 직관적으로 제시할 수 있도록 도와줍니다.

OrderingFilter를 이용한 정렬

Django REST framework은 OrderingFilter 클래스를 제공하여 API 결과를 정렬하는 기능을 제공합니다. 이 클래스를 사용하면 사용자는 URL의 query parameters를 통해 원하는 정렬 순서를 지정할 수 있습니다.

개발자는 OrderingFilter를 사용하려면 다음과 같이 설정해야 합니다:

REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
    ],
    'DEFAULT_PARSER_CLASSES': [
        'rest_framework.parsers.JSONParser',
    ],
    'DEFAULT_THROTTLE_CLASSES': [
        'rest_framework.throttling.AnonRateThrottle',
        'rest_framework.throttling.UserRateThrottle',
    ],
    'DEFAULT_THROTTLE_RATES': {
        'anon': '100/minute',
        'user': '1000/minute',
    },
    'DEFAULT_METADATA_CLASS': 'rest_framework.metadata.SimpleMetadata',
    'DEFAULT_VERSIONING_CLASS': 'rest_framework.versioning.AcceptHeaderVersioning',
    'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.coreapi.AutoSchema',
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework.authentication.SessionAuthentication',
    ],
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
    ],
    'DEFAULT_FILTER_BACKENDS': [
        'django_filters.rest_framework.DjangoFilterBackend',
    ],
    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.PageNumberPagination',
    'PAGE_SIZE': 10,
}

이제 OrderingFilter를 사용하여 원하는 필드에 대해 정렬할 수 있습니다:

from rest_framework.filters import OrderingFilter

class ProductListAPIView(ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    filter_backends = [OrderingFilter]
    ordering_fields = ['name', 'price']

위의 코드에서 ordering_fields를 사용하여 허용할 정렬 필드를 정의합니다.

결론

Django REST framework을 사용하면 데이터 필터링과 정렬 기능을 손쉽게 구현할 수 있습니다. 필터링을 통해 사용자는 원하는 조건에 맞는 결과만을 선택할 수 있고, 정렬을 통해 결과를 적절한 순서로 제시할 수 있습니다. 이러한 기능은 사용자 경험을 향상시키고 API의 유용성을 높일 수 있습니다.

더 많은 정보를 원한다면, Django REST framework 공식 문서를 참조하세요.