1.自分で作ったZara-オブジェクト向け

16581 ワード

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メソッドの戻り結果productsは、変数productsに含まれる.
返される結果はproduct_listに含まれます.
フィルタリング後の結果リストもfilters.pyで一度に行うかどうか考えた.
KakaoTalkへの登録時にKakaoTalkにデータをロードするのは別のオブジェクト化されています
結果はviews.pyで作成されたので,この方法に従った.
次のヒントは、特定の商品を選択したときに表示される商品詳細照会画面です.