지난 포스팅에 이어 객체지향프로그래밍을 통한 코드로 변경해보겠습니다.
views.py
에서 썼던 모든 필터링 조건을 filters.py
를 생성한 뒤 옮겼습니다.
class ProductList :
def __init__(self, offset, limit, category_id, item_id, color_id, size_id, min_price, max_price) :
self.offset = offset
self.limit = limit
self.category_id = category_id
self.item_id = item_id
self.color_id = color_id
self.size_id = size_id
self.min_price = min_price
self.max_price = max_price
def filter_products(offset, limit, category_id, item_id, color_id, size_id, min_price, max_price) :
product_filter = Q(item__category_id=category_id)
if item_id :
product_filter.add(Q(item__id__in = item_id), Q.AND)
if color_id :
product_filter.add(Q(detailproduct__color_id__in = color_id), Q.AND)
if size_id :
product_filter.add(Q(detailproduct__size_id__in = size_id), Q.AND)
if min_price and max_price :
product_filter.add(Q(price__gte=min_price)&Q(price__lte=max_price), Q.AND)
products = Product.objects.select_related('item').prefetch_related('detailproduct_set', 'thumbnail_set').\
filter(product_filter).order_by('-created_at')[offset:offset+limit]
return products
변수로 받은 값들에 대해 초기화를 위해 __init__
를 먼저 작성한 뒤
filter_products
라는 메서드를 통해 필터링한 상품 리스트를 리턴합니다.
지난 코드에서 order_by
가 추가됐는데, 대부분의 상품리스트의 경우 최신순이 기본조건인게
많아서 그렇게 설정해줬습니다.
from products.filters import ProductList
...
def get(self, request) :
try :
offset = int(request.GET.get('offset', 0))
limit = int(request.GET.get('limit', 15))
category_id = int(request.GET['category_id'])
item_id = request.GET.getlist('item_id', None)
color_id = request.GET.getlist('color_id', None)
size_id = request.GET.getlist('size_id', None)
min_price = int(request.GET.get('min_price', 20000))
max_price = int(request.GET.get('max_price', 200000))
if limit > 20 :
return JsonResponse({'message' : 'TOO_MUCH_LIST'}, status=400)
products = ProductList.filter_products(offset, limit, category_id, item_id, color_id, size_id, min_price, max_price)
product_list = [{
'id' : product.id,
'name' : product.name,
'price' : product.price,
'item_id' : product.item.id,
'item_name' : product.item.name,
'thumbnail' : [
{
'id' : thumbnail.id,
'url' : thumbnail.url
} for thumbnail in product.thumbnail_set.all()],
'detail_set' : [
{
'color_id' : detail.color_id,
'color_name' : detail.color.color,
'size_id' : detail.size_id,
'size_name' : detail.size.size
}
for detail in product.detailproduct_set.all()]
} for product in products
]
return JsonResponse({'message' : product_list}, status=200)
filter_products
메서드의 리턴 결과인 products
를 products
라는 변수에 담아서
반복문 돌린 결과를 product_list
에 담았습니다.
필터링 후 결과리스트까지 한 번에 filters.py
에서 할까 고민도 했지만,
카카오톡 로그인할 때, 카카오톡에서 데이터 불러오는 건 따로 객체화하고
그 결과를 views.py
에서 작성했었기 때문에 그 방법을 그대로 따랐습니다.
다음 포스팅은 특정 상품을 골랐을 때 나오는 화면인 상품상세조회입니다.