DRF- Filtering

jeong_hyeon·2022년 6월 2일
0

Django_DRF

목록 보기
10/12
post-thumbnail

1.DjangoFilterBackend의 filterset_fields 사용 방법

pip install django-filter

settings.py
INSTALLED_APPS = [
...
'django_filters' #추가
]

views.py
from django_filters.rest_framework import DjangoFilterBackend
	filter_backends = [DjangoFilterBackend] 
  filterset_fields = ['category', 'colors','price']

이런식으로 위에 필터가 추가 되어있는것을 알수있다.

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 filters

filter_backends = [filters.SearchFilter]
search_fields = ['name']

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

이런 Search창이 생기게 되며 앞서 설명한 필터와 동일하게 filter내부에 있다.

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

  • '^' : starts-with search 시작점부터 같은단어를 검색
  • '=' : exact matches 완전히 같은 단어를 검색
  • '@' : full-text search (현재는 Django의 PostgreSQL 백엔드 만 지원 )
  • '$' : regax search 정규식 검사
from rest_framework import filters

filter_backends = [filters.SearchFilter]
search_fields = ['$name']

3. OrderFilter의 ordering_fields 사용 방법

from rest_framework import filters
filter_backends = [DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter]
ordering_fields = ['id','price']
ordering = ['id']
  • ordering이라는 query parameter를 통해 정렬 기준이 요청되면, 이에 따라 정렬을 수행하고 반환해준다.
  • query paramter가 없다면, ordering의 default로 지정된 값을 기준으로 정렬되어 데이터를 반환한다.

물론 위에서 나온 3개를 섞어서 사용하는 방법도 있다.

from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters

class ProductView(generics.ListAPIView):
    queryset = Product.objects.all()
    serializer_class = ProductSerializers
    filter_backends = [DjangoFilterBackend, filters.SearchFilter,filters.OrderingFilter] 
    filterset_fields = ['category', 'colors','price']
    search_fields = ['$name']
    ordering_fields = ['id','price']
    ordering = ['id']

이런경우

이런식으로 한 화면에서 필터링이 가능하다!

0개의 댓글