1. 혼자 만들어보는 Zara - 객체지향

Kiyong Lee·2021년 12월 10일
0

개인프로젝트

목록 보기
7/9

혼자 만들어보는 Zara - 객체지향


지난 포스팅에 이어 객체지향프로그래밍을 통한 코드로 변경해보겠습니다.


1. filters.py

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가 추가됐는데, 대부분의 상품리스트의 경우 최신순이 기본조건인게
많아서 그렇게 설정해줬습니다.


2. views.py

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 메서드의 리턴 결과인 productsproducts라는 변수에 담아서
반복문 돌린 결과를 product_list에 담았습니다.

필터링 후 결과리스트까지 한 번에 filters.py에서 할까 고민도 했지만,
카카오톡 로그인할 때, 카카오톡에서 데이터 불러오는 건 따로 객체화하고
그 결과를 views.py에서 작성했었기 때문에 그 방법을 그대로 따랐습니다.


다음 포스팅은 특정 상품을 골랐을 때 나오는 화면인 상품상세조회입니다.

profile
ISTJ인 K-개발자

0개의 댓글

관련 채용 정보