DRF로 API Server를 만들면서 GET
요청에 query string
데이터를 같이 넘겨주면서 가져올 데이터를 filter를 줘야하는 일이 생겼다.
그런데 http://localhost:8000/accounts/?username=jaegu 와 같은 주소로 query string 데이터를 1개
만 보낼 때는 상관이 없었는데,,, 문제는 2개이상의 쿼리스트링으로 데이터를 보낼 때는 어떻게 처리해야되는 지에 대한 문제가 생겼다.
다른 API 문서들을 보면 GET 요청에 파라미터 들중 필수값
과 선택값
이 있는것처럼 나도 여러개의 query string을 받고, 그중에 선택적으로 넣어도되고 안넣어도 되는식의 코드를 작성하고 싶었다..
근데 생각보다 구글링을해도 관련자료가 많이 안나오더라..
그런이유로 http://localost:8000/accounts/?username=jaegu&age=20 같은 URL주소를 만들고 싶었음
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) 으로 코드가 인식되어서 에러가 발생함..
class YtChannelDPIAPI(generics.ListAPIView):
queryset = User.objects.all()
serializer_class = UserSerializer
filter_backends = [DjangoFilterBackend]
filterset_fields = ['username', 'age']
해결방법을 찾아보다가 django-filter
라는 라이브러리를 사용하면 쉬워진다는 말을 보았다.. 그래서 적용을 해보았고 공식문서를 보고 대충 따라해봤더니 위와 같이 코드가 변했다..
포스트맨으로 하나빼고, 둘다넣어보고 이것저것 테스트 해보니까 잘된다!
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 라이브러리를 적용한 코드에서는 어떻게 커스텀할 지 또 공부할 거리가 생기게 되는거같다... 나중에 찾아보고 일단 포스팅은 여기까지..
혹시 방법을 아는분이 있다면 공유부탁드립니다..