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
で作成されたので,この方法に従った.
次のヒントは、特定の商品を選択したときに表示される商品詳細照会画面です.
Reference
この問題について(1.自分で作ったZara-オブジェクト向け), 我々は、より多くの情報をここで見つけました
https://velog.io/@kyleee/1.-혼자-만들어보는-Zara-객체지향
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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
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)
Reference
この問題について(1.自分で作ったZara-オブジェクト向け), 我々は、より多くの情報をここで見つけました https://velog.io/@kyleee/1.-혼자-만들어보는-Zara-객체지향テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol