Django Filter Backends

GisangLee·2022년 8월 27일
0

django

목록 보기
16/35

1. request.GET.get VS filter backends

request.GET.get("filtering", None)

user_type = request.GET.get("type", None)
gender = reqeust.GET.get("gender", None)
is_vip = request.GET.get("is_vip", None)

if user_type is None or gender is None or is_vip is None:
	...
    ...
    

위와 같이 개별로 쭉 쿼리 스트링을 가져온다면
쿼리스트링 필요 여부에 따라 if 문이 무한이 반복될 수 있다.

if문이 병렬로 늘어나던 직렬로 늘어나던 상관없이
많은 필터링 조건들이 요청 데이터로 넘어왔는지
하나하나 신경 써야한다.


filter backends

    filter_backends = [DjangoFilterBackend, filters.SearchFilter, filters.OrderingFilter]
    filterset_fields = ["user_type", "gender", "is_vip",]
    search_fields = ['user_type', "username", "email", 'gender']
    ordering_fields = ["pk", "user_type", "is_vip", "gender", "created_at"]
http://localhost:8000/proj/?user_type=매니저&search=django&ordering=is_vip

이 얼마나 아름다운지 보이십니까

filterset_fileds > 필터링할 모델 필드명

search_fileds > ?search 키워드로 작성된 문자열을 어떤 모델 필드에서 찾을 것인지

ex ) search_fields = ['user_type', "username", "email", 'gender'] 일 경우,
?search=매니저 라고 했을 때
"매니저"라는 문자열을 위에 지정한 열별로 다 검색해서 찾는다.


user_type 컬럼에 매니저 라는 문자열이 있는 데이터가 있는지
username 컬럼에 매니저 라는 문자열이 있는 데이터가 있는지
email 컬럼에 매니저 라는 문자열이 있는 데이터가 있는지
gender 컬럼에 매니저 라는 문자열이 있는 데이터가 있는지
각각에 포함된 데이터를 전부 가져온다.

ordering_fileds > 정렬할 기준이 될 모델 필드명


2. filter backends 장점

filter, search, ordering을 쿼리 스트릥에 지정하지 않을 경우
혹은 각각의 쿼리 스트링을 기재 하지 않았을 경우, 알아서 없는 것으로 판단하여 진행한다.

request.GET.get 은 위에서 보았듯이

request.GET.get("username", None)

과 같이 해당 쿼리스트링을 가져오고 없으면 디폴트 None을 준다고 직접적으로 코드상에
명시해야하는데

filter backends는 명시하지 않아도 DRF가 알아서 해준다. ( 겁나 좋죠 )


profile
포폴 및 이력서 : https://gisanglee.github.io/web-porfolio/

0개의 댓글