1차 프로젝트: 중간 정리(4)

signet·2021년 2월 25일
0

상품리스트 메인 페이지를 작성하는 것에 있어서, 최초에는 path parameter로 구성을 했었다. 그러나 리뷰 페이지를 작성하던 중 query parameter를 공부하였고, 그것을 통해 상품리스트 메인 페이지를 정돈할 수 있었다. 이번 포스트에서는 query parameter에 대해서 정돈해보고자 한다.

Query Parameter

Query parameter는 url을 받는 방식을 의미한다. 다른 예인 path parameter의 경우, url뒤에 특정 정보를 바로 입력받는다. 예를 들어

/user/1
/category/lettervitamins

에서 1과 lettervitamins가 path parameter이다. path parameter를 받는 경우, urls.py의 작성은

/user/<int: id>
/category/<slug: category_name>

의 방식으로 받고, views.py의 클래스에 *arg값을 입력해주어야 한다. path parameter는 유일하게 존재하는 정보를 GET하거나 UPDATE, DELETE하는 경우 받을 필요가 있을 수 있다.
하지만 유일한 정보가 아닌, 많은 정보를 필터링해서 GET을 할 필요가 있는 경우, path parameter를 필터링에 필요한 정보로서 활용하기에는 손색이 있다. 예를 들어, 위의 예시에서 category를 path parameter인 category_name으로 필터링을 하려 하는 경우, 전체를 보여주는 클래스와 특정 category를 보여주는 클래스가 따로 처리되거나, category 뿐만 아니라 다른 필터 조건이 있는 경우, 그것을 처리해주는 url과 클래스를 별개로 작성해야 한다.
이러한 필터를 수행하는 일에 있어서 query parameter를 이용하면 로직을 단순화 할 수 있다. query parameter는 기준 url에서 새로운 url을 작성하는 것이 아니라, 기준 url에 추가 정보를 보내주는 것이다. 예를 들어

/user id==1&number==2
->
/user?1&2

의 형식으로 보낸다. 이 경우 실제 처리하는 url은 /user 이다. 이렇게 query parameter를 받으면, query parameter를 처리해주어야 한다.

query = request.GET.get('query parameter name', default)

위와 같이 query parameter를 받을 수 있다. 이때, query parameter를 받지 않은 경우도 있기 때문에 default값을 입력해주어야 한다.
이 상태에서 받은 parameter를 이용하여 필터링을 해주는 코드를 작성하여주면 된다. 이때, query parameter의 값과 필터링을 위해 데이터베이스의 값을 이용해주어야 하는데, 이 값이 일치하지 않을 수 있다. 예를 들어, url의 query parameter는 lettervitamins이지만, 데이터베이스에 카테고리 이름은 Letter Vitamin인 경우, query parameter값을 바로 필터에 이용할 수 없다.
이를 처리해주기 위해선 딕셔너리를 이용할 수 있다. 위의 경우

query_dic = {'lettervitamins': 'Letter Vitamin}

으로 작성하면, lettervitamins를 key값으로, 그와 연관된 데이터베이스 상의 이름을 value값으로 가지는 딕셔너리가 생성된다. 이를 기준으로 필터링을 하고 싶다면

/product?levvervitamins
query = request.GET.get('name', 'all)
query_dic = {'lettervitamins': 'Letter Vitamin', 'all': ''}
Category.objects.filter(name = query_dic['query'])

이렇게 하면 필터로 category name이 Letter Vitamin인 객체만이 필터링되어 나온다.

0개의 댓글