구방문방구 | 리팩토링: 상품리스트 모듈화

2022. 10. 1. 22:11·wecode
반응형

프로젝트 코드를 쳐다보고있는데 메인페이지와 카테고리별 상품 페이지의 리스트 만드는 코드가 완전히 똑같은걸 발견했다.

당연함. 메인페이지의 상품 리스트는 전체상품에서 필터링(신상품, 친환경, 베스트)된 리스트를 보여주는 것이기 때문...

✏️ 메인페이지 뷰(수정전)

메인페이지 신상품 리스트

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)
        ...

 

테스트

메인
전체
2번 카테고리

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'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
'wecode' 카테고리의 다른 글
  • 프리온보딩 | 1차과제 - 2
  • 프리온보딩 | 1차과제 - 1
  • Code Kata | Week3 - Day2
  • 마이허니트립 | 프로젝트 회고
이라후
이라후
  • 이라후
    화이팅
    이라후
  • 전체
    오늘
    어제
    • 분류 전체보기 (133)
      • TIL (23)
      • 기타 (26)
      • Python (14)
      • Django (10)
      • JavaScript (8)
      • git & GitHub (8)
      • Web (10)
      • Go (3)
      • wecode (31)
  • 반응형
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
이라후
구방문방구 | 리팩토링: 상품리스트 모듈화
상단으로

티스토리툴바