[drf]airbnb-api -16 Searching

Hyeseong·2021년 3월 28일
0
post-thumbnail

search API

기본적인 장고 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:
# 생략
profile
어제보다 오늘 그리고 오늘 보다 내일...

0개의 댓글