반응형
프로젝트 코드를 쳐다보고있는데 메인페이지와 카테고리별 상품 페이지의 리스트 만드는 코드가 완전히 똑같은걸 발견했다.
당연함. 메인페이지의 상품 리스트는 전체상품에서 필터링(신상품, 친환경, 베스트)된 리스트를 보여주는 것이기 때문...
✏️ 메인페이지 뷰(수정전)

class MainPageView(View):
def get(self, request):
def get_list(products):
product_list = [{
'id' : product.id,
'name' : product.name,
'price' : product.price,
'is_green': product.is_green,
'is_best' : product.is_best,
'images' : [{
'id' : image.id,
'url': image.url
} for image in product.productimage_set.all()]
} for product in products]
return product_list
new_products = Product.objects.all().prefetch_related('productimage_set').order_by('-created_at')[:8]
best_products = Product.objects.filter(is_best = True).prefetch_related('productimage_set').order_by('-created_at')[:8]
green_products = Product.objects.filter(is_green = True).prefetch_related('productimage_set').order_by('-created_at')[:8]
return JsonResponse({
'new_products' : get_list(new_products),
'best_products' : get_list(best_products),
'green_products': get_list(green_products)}, status=200)
메인페이지에서는 같은 리스트 세 개를 만들어야 해서 get_list라는 함수를 만들어서 활용했었다.
✏️ 카테고리별 페이지 뷰(수정전)

class ProductListView(View):
def get(self, request, category_id):
try:
...
products_data = [{
'id' : product.id,
'name' : product.name,
'price' : product.price,
'is_green': product.is_green,
'is_best' : product.is_best,
'images' : [{
'id' : image.id,
'url': image.url
} for image in product.productimage_set.all()]
} for product in products]
return JsonResponse({
'category_data': category_data,
'products_data': products_data}, status=200)
...
상품 리스트 페이지에서도 완전히 같은 로직으로 변수명까지 같았는데 왜 몰랐을까~
그래서 MainPageView의 get_list함수를 core/utils에 옮겨서 ProductListView에서도 사용할 수 있도록 만들었다.
🔥 수정후
# core/utils.py
...
def get_product_list(products):
product_list = [{
'id' : product.id,
'name' : product.name,
'price' : product.price,
'is_green': product.is_green,
'is_best' : product.is_best,
'images' : [{
'id' : image.id,
'url': image.url
} for image in product.productimage_set.all()]
} for product in products]
return product_list
# products/views.py
...
from core.utils import get_product_list
class MainPageView(View):
def get(self, request):
new_products = Product.objects.all().prefetch_related('productimage_set').order_by('-created_at')[:8]
best_products = Product.objects.filter(is_best = True).prefetch_related('productimage_set').order_by('-created_at')[:8]
green_products = Product.objects.filter(is_green = True).prefetch_related('productimage_set').order_by('-created_at')[:8]
return JsonResponse({
'new_products' : get_product_list(new_products),
'best_products' : get_product_list(best_products),
'green_products': get_product_list(green_products)}, status=200)
class ProductListView(View):
def get(self, request, category_id):
try:
...
products = products.prefetch_related('productimage_set').order_by(sort_by[request.GET.get('sorting', None)])[ offset : offset + limit ]
products_data = get_product_list(products)
return JsonResponse({
'category_data': category_data,
'products_data': products_data}, status=200)
...
테스트



반응형
'wecode' 카테고리의 다른 글
| 프리온보딩 | 1차과제 - 2 (0) | 2022.10.06 |
|---|---|
| 프리온보딩 | 1차과제 - 1 (0) | 2022.10.05 |
| Code Kata | Week3 - Day2 (0) | 2022.09.14 |
| 마이허니트립 | 프로젝트 회고 (0) | 2022.08.29 |
| 마이허니트립 | 예약목록 api : annotate를 이용한 정렬 (0) | 2022.08.22 |