DRF - 여러 queryString받기

강재구·2021년 5월 4일
4

Django REST Framework

목록 보기
2/3

1. 문제발생

DRF로 API Server를 만들면서 GET 요청에 query string 데이터를 같이 넘겨주면서 가져올 데이터를 filter를 줘야하는 일이 생겼다.
그런데 http://localhost:8000/accounts/?username=jaegu 와 같은 주소로 query string 데이터를 1개 만 보낼 때는 상관이 없었는데,,, 문제는 2개이상의 쿼리스트링으로 데이터를 보낼 때는 어떻게 처리해야되는 지에 대한 문제가 생겼다.

2. 상황조건

다른 API 문서들을 보면 GET 요청에 파라미터 들중 필수값선택값 이 있는것처럼 나도 여러개의 query string을 받고, 그중에 선택적으로 넣어도되고 안넣어도 되는식의 코드를 작성하고 싶었다..
근데 생각보다 구글링을해도 관련자료가 많이 안나오더라..
그런이유로 http://localost:8000/accounts/?username=jaegu&age=20 같은 URL주소를 만들고 싶었음

3. 코드

class TestAPI(APIView):

    def get(self, request):
        queryset = User.objects.all()

        if request.query_params:
            username = request.query_params.get('username', None)
            age = request.query_params.get('age', None)
            queryset = queryset.filter(username=username, age=age)

        serializer = UserSerializer(queryset, many=True)

        return Response(data, status=status.HTTP_200_OK)

저런식으로 작성을 하긴했는데.. postman으로 querystring을 1개만 넣어보고, 2개만 넣어보고 둘다 빼보고.. 테스트를 해보는데 문제가 발생했다.

queryString 값으로 username만 넣었을때, age=None 처리되면서
queryset = queryset.filter(username=jaegu, age=None) 으로 코드가 인식되어서 에러가 발생함..

4. 해결

class YtChannelDPIAPI(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    filter_backends = [DjangoFilterBackend]
    filterset_fields = ['username', 'age']

해결방법을 찾아보다가 django-filter라는 라이브러리를 사용하면 쉬워진다는 말을 보았다.. 그래서 적용을 해보았고 공식문서를 보고 대충 따라해봤더니 위와 같이 코드가 변했다..

포스트맨으로 하나빼고, 둘다넣어보고 이것저것 테스트 해보니까 잘된다!

5. 문제

age=20 으로 만약 넣으면, age가 20세 인 데이터만 정확히 불러오긴 하는데..

저렇게 넣으면 age 20세 이상의 데이터들을 받아오고 싶을때는 어떻게 처리해야되나.. 또 고민이 생겼다..

라이브러리를 안쓰고 적용했을 땐 그냥

class Test(APIView):
    def get(self, request):
        queryset = User.objects.all()
        
    if request.query_params:
        age = request.query_params.get('age', None)
        queryset = queryset.filter(age__gte=age)

대충 위에처럼 코드로 __gte 을 적용시켜주면 되는데 ,,
django-filter 라이브러리를 적용한 코드에서는 어떻게 커스텀할 지 또 공부할 거리가 생기게 되는거같다... 나중에 찾아보고 일단 포스팅은 여기까지..

6. 참고블로그

search_fields 관련포스팅

profile
Python Backend Developer @Fitpet

2개의 댓글

comment-user-thumbnail
2021년 5월 4일

혹시 방법을 아는분이 있다면 공유부탁드립니다..

1개의 답글