TIL-041|デコレーションして、ホームズプロジェクト(4)メニュービュー、商品リストを実現
13929 ワード
📝 ホームページ-MenuList API実装
コードを作成する前に、デコレーションサイトのホームページクラスはクラス内にSubcategoryがあり、クラス内に次のSubcategoryがあるので、フロント担当者とのコミュニケーションが重要だと考えています.フロントで必要なデータフォーマットを尋ね、議論を続けた.
作成されたコード
class MenuListView(View):
def get(self, request):
menus = Menu.objects.prefetch_related('category_set', 'category_set__subcategory_set')
menu_data = [{
'menu_id' : menu.id,
'menu_name' : menu.name,
'image_url' : menu.image_url,
'categories' : [{
'id' : category.id,
'name' : category.name,
'subcategories' : [{
'id' : subcategory.id,
'name' : subcategory.name,
} for subcategory in category.subcategory_set.all()],
} for category in menu.category_set.all()],
} for menu in menus]
return JsonResponse({'menus':menu_data}, status = 200)
ホームページのMenu、Category、Subcategoryを実装するために、MenuListViewクラスが作成されました.
データフォーマットは、フロントと議論して決定し、必要なJsonフォーマットのデータを送信するために上記のコードを記述する.
実際,上記データ型要求DBのQuery回数は非常に高い.従って、プリフェッチ解放ORM最適化を用いることにより、より効率的なデータ呼び出しが実現される.
📝 商品ページ-商品完全リストAPIの実装
商品リスト全体のデータを呼び出すことにより、フロントスタッフと議論し、各ページの商品数を設定し、呼び出されたデータを低価格、高価格、採点順にフィルタリングすることが主な実施事項である.
作成されたコード
class ProductGroupsView(View):
def get(self, request):
sub_category_id = request.GET.get("SubCategoryId")
ordering = request.GET.get("ordering")
OFFSET = int(request.GET.get("offset", 0))
LIMIT = int(request.GET.get("limit", 16))
product_groups = ProductGroup.objects.filter(sub_category_id = sub_category_id).annotate(
best_ranking = Avg('review__star_rate'),
review_count = Count('review'),
review_star_point = Avg('review__star_rate'),
discounted_price = F('displayed_price') - F('displayed_price') * (F('discount_rate')/100),
latest_update = F('created_at')
).order_by(ordering)[OFFSET:OFFSET+LIMIT]
results = [
{
'id' : product_group.id,
'company' : product_group.company,
'product_name' : product_group.name,
'price' : float(product_group.displayed_price),
'image_url' : product_group.productimage_set.all()[0].image_url,
'discount_rate' : float(product_group.discount_rate),
'discounted_price' : float(round(product_group.discounted_price,0)),
'star_point' : float(product_group.review_star_point),
'review' : product_group.review_count
}for product_group in product_groups]
return JsonResponse({'product_groups':results}, status = 200)
SubCategoryによって呼び出されるデータ型が異なるため、SubCategoryIDを最初のクエリー・パラメータに設定し、フィルタの基準を2番目のクエリー・パラメータに設定します.
フロントスタッフに相談して、1ページあたりの商品数を16個に設定するので、LIMITのdefault値は16に設定します.
呼び出しデータのフィルタリングを実現するために、注釈によって仮想フィールドを作成して必要なデータを取得し、order by()でソートします.order by()の基準は2番目のqueryパラメータ(ordering)に設定されます.
Reference
この問題について(TIL-041|デコレーションして、ホームズプロジェクト(4)メニュービュー、商品リストを実現), 我々は、より多くの情報をここで見つけました https://velog.io/@lck0827/TIL-041-꾸며줘-홈즈-project4메뉴-뷰-상품리스트-구현하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol