TIL125. DRF : Filtering 사용하기

11618 단어 drfdrf

📌 이 포스팅에서는 Django Rest Framework의 Filtering 사용 방법에 대해서 정리하였습니다.



🌈 Filtering 사용하기

🔥 DjangoFilterBackend의 filterset_fields 사용 방법

🔥 SearchFilter의 search_fields 사용 방법

🔥 OrderFilter의 ordering_fields 사용 방법



1. DjangoFilterBackend의 filterset_fields 사용 방법

✔️ django filter를 아래와 같이 설치하고, settings.py에 설치한 django-filter를 등록한다.

$ > pip install django-filter

✔️ django filter는 filtering 기능을 제공하는 class을 가진 패키지이다.

# Application definition
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'rest_framework',
    'django_filters', # 👈 django-filter 등록
    'cbvApp',
]

✔️ settings.py의 REST_FRAMEWORK 설정을 통해 전역으로 filtering을 지정할 수도있고, 각 View마다 지정도 가능하다.

✔️ 각 View에서 지정하기 위해서는 DjangoFilterBackend를 import한 뒤, 해당 Class 내에 filter_backends, filterset_fields를 아래 처럼 지정하면 된다.

from rest_framework import viewsets
from rest_framework.pagination import LimitOffsetPagination
from django_filters.rest_framework import DjangoFilterBackend
from fbvApp.models import Student
from fbvApp.serializers import StudentSerializer
# StudentPagination
class StudentPagination(LimitOffsetPagination):
    default_limit = 4
# StudentViewSet
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = StudentPagination
    filter_backends = [DjangoFilterBackend] # 👈 DjangoFilterBackend 지정
    filterset_fields = ['name', 'score'] # 👈 filtering 기능을 사용할 field 입력

✔️ 아래와 같이, Filters 버튼이 생긴것을 볼 수 있고, filterset_fields에 정의한 필드가 form 양식으로 나타난다.
✔️ query parameter는 해당 field 명으로 엔드포인트에 붙는 것을 확인할 수 있다.



2. search_fields 사용 방법

✔️ search_fields를 사용하면 해당 query parameter로 넘어온 값을 지정된 filter에서 전부 검색해서 그 결과를 반환한다.

✔️ Search Filter 기능은 rest_framework의 filters에 내장되어 있다.

✔️ 아래처럼 filter_backends에 SearchFilter를 지정 후, search_fields에 대상이 될 fields를 입력한다.

from rest_framework import viewsets
from rest_framework.pagination import LimitOffsetPagination
from rest_framework import filters # 👈 filters 가져오기
from fbvApp.models import Student
from fbvApp.serializers import StudentSerializer
# StudentPagination
class StudentPagination(LimitOffsetPagination):
    default_limit = 4
# StudentViewSet
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = StudentPagination
    filter_backends = [filters.SearchFilter] # 👈 filters에 SearchFilter 지정
    search_fields = ['id', 'score'] # 👈 search가 적용될 fields 지정

✔️ search_fields에 지정된 field에 query parameter(search) 전달된 값을 대입하여 필터링을 진행한다.

✔️ qeury parameter로 전달된 값을 필터할 때, 아래의 옵션을 사용하여 더 효과적으로 필터링이 가능하다.

  • '^' : starts-with search
  • '=' : exact matches
  • '@' : full-text search
  • '$' : regax search
# exmaple
search_fields = ['=id', '^score']


3. OrderFilter의 ordering_fields 사용 방법

✔️ OrderFilter 또한 rest_framework에서 기본 제공하는 필터 기법이며, 이는 데이터를 정렬하는데 유용하게 사용된다.

✔️ ordering_fields을 지정하지 않으면, 모든 field가 정렬 대상으로 사용 가능하고, 보통 ordering_fields을 지정해서 사용한다.

✔️ 또한 query parameter로 ordering 방식은 ordering을 통해 가능하다.

from rest_framework import viewsets
from rest_framework.pagination import LimitOffsetPagination
from rest_framework import filters # 👈 OrderFiltering도 filters에 포함되어 있다.
from fbvApp.models import Student
from fbvApp.serializers import StudentSerializer
#  StudentPagination
class StudentPagination(LimitOffsetPagination):
    default_limit = 4
# StudentViewSet
class StudentViewSet(viewsets.ModelViewSet):
    queryset = Student.objects.all()
    serializer_class = StudentSerializer
    pagination_class = StudentPagination
    filter_backends = [filters.OrderingFilter] # 👈 OrderingFitering 지정
    ordering_fields = ['name', 'score'] # 👈 정렬 대상이 될 field 지정
    ordering = ['id'] # 👈 Default 정렬 기준 지정

✔️ ordering이라는 query parameter를 통해 정렬 기준이 요청되면, 이에 따라 정렬을 수행하고 반환해준다.

✔️ query paramter가 없다면, ordering의 default로 지정된 값을 기준으로 정렬되어 데이터를 반환한다.

좋은 웹페이지 즐겨찾기