기본적인 장고 search API 구현이에요.
쿼리셋 파라미터를 받아오고, 딕셔너리를 이용해서 키:벨류로 짜놓은 다음에 쿼리 파라미터로 받아온 검색 조건을 딕셔너리에 할당한 다음 filter()메서드에 언패킹하면 되는 구조에요.
@api_view(['GET'])
def room_search(request):
max_price = request.GET.get('max_price',None)
min_price = request.GET.get('min_price',None)
beds = request.GET.get('beds',None)
bedsrooms = request.GET.get('bedsrooms',None)
bathrooms = request.GET.get('bathrooms',None)
filter_kwargs = {}
if max_price is not None:
filter_kwargs['price__lte'] = max_price
if min_price is not None:
filter_kwargs['price__gte'] = min_price
if beds is not None:
filter_kwargs['beds__gte'] = beds
if bedsrooms is not None:
filter_kwargs['bedsrooms__gte'] = bedsrooms
if bathrooms is not None:
filter_kwargs['bathrooms__gte'] = bathrooms
paginator = OwnPagination()
try:
rooms = Room.objects.filter(**filter_kwargs)
except ValueError: # value값이
rooms = Room.objects.all()
results = paginator.paginate_queryset(rooms, request)
serializer = RoomSerializer(results, many=True)
return paginator.get_paginated_response(serializer.data)
작동원리는 아래와 같아요.
쿼리 파라미터에 이상한 값들을 넣어서 발생하는 경우를 막아야해요.
그럴려면 try~ except~ 구문으로 당연히 막아야겠조~
그래서 url가지고 장난치는거 막기 위해선 가볍게 try, except구문에서 ValueError구문을 통해서 처리가 가능해요.
# 생략
try:
rooms = Room.objects.filter(**filter_kwargs)
except ValueError:
# 생략