TIL-041|デコレーションして、ホームズプロジェクト(4)メニュービュー、商品リストを実現


📝 ホームページ-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)に設定されます.
  • ✔完全商品リスト実施断図