정렬기준
배민문방구 홈페이지에는 추천순(기본)/최신순/높은가격순/낮은가격순 네 가지의 정렬 방법이 있는데
추천순은 구현이 안되어있어서 기본정렬은 정렬을 안했을때 나오는 순서인 등록순(id)순으로 했다.
쿼리 파라미터
쿼리 파라미터의 키는 원래 사이트를 참고해서 sorting으로 했다.
producs/?sorting=BASIC
이렇게 들어오는 쿼리 파라미터에서 정렬 기준인 BASIC값을 받고 싶으면
request.GET.get('sorting', None)
이렇게 사용하면 된다. 뒤의 None은 기본값인데 sorting이라는 키가 쿼리에 없으면 None이 반환된다. 기본값으로 None을 줘서 정렬기준을 요청하지 않으면 기본순인 id순서대로 나오도록 했다.
order_by
정렬은 쿼리셋에 order_by(기준)을 적용시켜서 할 수 있는데 기본값은 'id', 최신순은 '-created_at', 높은가격순은 '-price', 낮은가격순은 'price'를 하면 되는데, 쿼리 파라미터로 처음부터 그냥 ?sorting=id, ?sorting=-created_at 이런식으로 받을까 했지만 쉽게 가기보다 실제 사이트랑 비슷하게 해보고 싶었고, 테이블 컬럼값이 노출될 수 있기 때문에 실제 사이트처럼 키워드로 정렬기준을 받는 방법으로 구현을 하기로 했다.
신상순/높은가격순/낮은가격순 - (NEW/HIGH_PRICE/LOW_PRICE)
딕셔너리 이용
reauest.GET.get('sorting')으로 정렬기준이 들어오면 None일때, 'NEW'일때....를 switch case로 하면 될것같았는데, 파이썬에는 switch-case문이 없다는걸 검색을 통해 알았다. 없는 이유가 if문, 딕셔너리로 대체가 가능하기 때문이라고 해서 생각해보니 해당 case일경우->해당 key가 있을경우로 하면 되기 때문에 딕셔너리를 switch-case와 똑같이 사용할 수 있을것 같아서 if-elif보다는 딕셔너리의 키를 이용해 정렬 기준을 가져오게 했다.
sort_by = {
None : 'id',
'BASIC' : 'id',
'NEW' : '-created_at',
'HIGH_PRICE': '-price',
'LOW_PRICE' : 'price'
}
그래서 sort_by라는 딕셔너리를 만들어서 요청으로 들어오는 sorting의 값을(None/NEW/HIGH_PRICE/LOW_PRICE) 딕셔너리의 키로 넣고 값으로 order_by()괄호에 들어갈 정렬기준을 입력했다.
그리고 카테고리에 해당하는 상품들로만 구성된 쿼리셋인 products를 해당 기준으로 정렬해서 정렬기능을 구현했다.
products = products.order_by(sort_by[request.GET.get('sorting', None)])
참고
'wecode' 카테고리의 다른 글
| 구방문방구 | orm최적화(MainPageView, ProductListView) (0) | 2022.07.31 |
|---|---|
| 구방문방구 | 상품목록 페이지네이션(offset, limit), 검색 (0) | 2022.07.30 |
| 구방문방구 | 메인페이지, 상품상세페이지 api (0) | 2022.07.30 |
| 구방문방구 | 전체/카테고리별 상품리스트 api (0) | 2022.07.30 |
| 구방문방구 | 데이터베이스 모델링 (0) | 2022.07.24 |