Today I Learnt How to Response Queryset

Jiwon Jung·2021년 1월 18일
0
post-thumbnail

Queryset response

catergory filter

제품의 list views를 구현 하는 와중에 사이트에서 카테고리별 혹은 원하는 정렬 메소드에 맞게 값을 정렬하여 응답할 수 있는 방법을 찾고 있었습니다.


윗 그림과 같이 카테고리를 짜면,

for items in products:   
                item = {
                            'name'          :items.name,
                            'main_image'    :items.main_image,
                            'price'         :items.price,
                            'money_replace' :items.money_replace,
                            'create_at'     :items.create_at,
                        }

아랫 아이템이 해당 카테고리에 맞게 새로운 리스트에 append를 하여 JsonResponse로 전달하고자 합니다.

사용한 방법은 카테고리에 int id값을 주어 해당 category foreignkey를 필터한 제품만 불러 들이는 방법입니다.

products = Product.objects.filter(category_id=catCd)

여기서 해당 카테고리를 활성하면 해당 id값을 요청받게 REST API의 get parameter로 해당 인자 값을 받고자 하였습니다.

REST API

해당 제품페이지에 url.py 파일에 rest apu uri를 설정 하였습니다.

path('/product_list/<int:catCd>', views.ProductListView.as_view())

기존 기능으로 지정된 path 뒤에 <int:catCD>라는 get parameter를 사용하였습니다. catCD(Category Code)에 입력되는 카테고리_id foreignkey에 해당되는 카테고리 제품을 filtering 하는 방식입니다.

Queryset Sorting

다시 지정 방식 별 제품을 정렬하여 값을 돌려주고자 하였습니다.

이번에는 요청자에게 조금더 가시적인 방법으로 parameter를 설정하고자 하였습니다.

path('/product_list/<int:catCd>/<str:sorting>', views.ProductListView.as_view())

이번 REST API에는 카테고리는 <int:catCD>라는 정수형 parameter를, 정렬 방식은 <str:sorting>라는 문자열 parameter를 받고자 하였습니다.

그럼 받은 파라미터를 어떻게 활용하여 정렬 패턴을 적용할까?라는 문제점에 부딛히게 되었습니다.

여기서 새로 배운!!
Django의 order_by 메서드 입니다.
단순히 불러오는 인스턴스의 순서를 order_by에 필드를 입력하여 그 필드를 기준으로 filter를 하여 정렬하는 방식입니다.

sort_type = {
                'low_price':'price',
                'high_price':'-price',
                'new':'create_at'
                }
                
products = Product.objects.filter(category_id=catCd).order_by(sort_type[sorting])

저희는 해당 조건이 가격, 날짜, 좋아요 순이기 때문에 먼저 해당 get parameter에 대응되는 필드를 딕셔너리 방식으로 저장하였습니다.

이후 필드를 order_by에 적용시켜 낮은 가격, 높은 가격, 최신순, 좋아요 순으로 매서드를 정하였습니다.

그럼 '낮은 가격과 높은 가격의 구분은 어떻게 해야할까?'라는 난관에 부딛혔습니다. 기본 배열의 sorting 방식에 사용한 reverse =True를 사용해 보았지만, 효과가 없자 찾아본 결과 해당 필드 앞에 '-'(마이너스)를 붙히면 reverse가 됩니다!!!!

이상 qeurysey 필터별 그리고 정렬 매서드별 호출 방법이였습니다.

profile
Venire, Videre, Vincere

0개의 댓글