最初のアイテムひっくり返す


以前に作成したビューは、約2日間のモデリングを組み合わせた結果です.
フロントの友人に見せるために30分以内にデータベースを作成したが、データベース接続回数を減らし、効率を高めるために、それなりの改造も行われた.
しかし結局ひっくり返され、以前のコードと後のコードを比較したいと思います.

1.前のコードを置換


1.商品リストAPI(byカテゴリ)

  • URLpathprameerで受信した「カテゴリ」値を基準とします.
  • 商品の1つの属性は「Category」表を参照し、select relatedを一度に呼び出しています.
  • 商品については、1:N条件の「Like」テーブルを複数回使用する必要があります.DB接続が複数回発生しないように、使用可能なデータを一度にロードします.
  • # 카테고리, 메뉴이름, 조리시간, 몇인분인지, 좋아요 개수
    class ListByCategory(View) :
        def get(self,request,category_id) :
            data = Products.objects.select_related('category').filter(category_id=category_id)
            product_lists = []
            for i in data :
                product_lists.append(i.id)
    
            # 좋아요 테이블에서, 우리가 보여줄 목록에 있는 상품이 들어있는 모든 좋아요 데이터를 가져와서 Counter 사용
            likes = list(Like.objects.filter(product_id__in=product_lists).values_list())
            likes_list = Counter([x[1] for x in likes])
            like_boolean = []
    
            # AccessToken이 있는 경우에, Like 테이블에서 해당 사용자가 좋아요를 누른 상품 리스트를 찾음.
            if 'Authorization' in request.headers :
                user_id = get_user_id(self,request)
                like_boolean = [x[2] for x in list(Like.objects.filter(user_id =user_id, product_id__in=product_lists).values_list())]
    
            result = []
            for i in data :
                result.append({
                    "id"            : i.id,
                    "category"      : i.category.name,
                    "name"          : i.name,
                    "like"          : likes_list[i.id],
                    "this_user_like": int(i.id in like_boolean),
                    }
                )
            
    
            return JsonResponse({
                "result" : result
            })
            

    2.商品詳細ページ

  • URLPATHにて商品IDを取得し、これを基準として処理を行った.
    1.N:N関係のラベル
    2.. 1:Nは仲が良くて、詳しいピクチャー
    3.. 逆参照関係の詳細
    一度のロードのためにDjangoが提供するプリフェッチ相関()を使用した.
  • # 제품명, 조리시간, 몇인분인지, 카테고리, 좋아요 개수,  해시태그
    class DetailByProduct(View) :
        def get(self,request,product_id) :
            
            # product 테이블의 ID를 foreignKEY로 사용하는 테이블들을 한번에 가져오기 위해 prefetch_realated사용
            products = Products.objects.select_related('category'
            ).prefetch_related('product_main_images','products_hashtag', 'product_detail_attrs'
            ).get(id=product_id) #1
    
            likes = Like.objects.filter(product_id=product_id).count()
            
            hash_numbers = [x[0] for x in list(products.products_hashtag.values_list('hashtag_id'))]
            detail = [{
                "text" : i.text,
                "image_url" : i.image_url,
                "priority" : i.priority,
                } for i in products.product_detail_attrs.filter(product_id=product_id)]
            
            hash_names = [x[0] for x in list(Hashtags.objects.filter(id__in=hash_numbers).values_list('name'))]
    
            result = {
                "image"         : products.product_main_images.values("main_image_url").get(product_id=product_id)["main_image_url"],
                "category"      : products.category.name, #1
                "name"          : products.name,
                "likes"         : likes,
                "hashtag"       : hash_names
            }
    
            return JsonResponse({
                "result" : [result],
                "detail" : detail
            })

    3.カタログ(いいね基準、優先度基準、検索語基準)

  • それぞれの基準が違うので、それぞれ違うテーブルを持ってきます.
  • 以降は、規格ごとに商品IDを取得し、商品IDに基づいてカテゴリをソートしていると思いますが、ほぼ同じです・・・コードに微妙な変化(属性名など)が発生し、いくつかの機能を関数として減算し、カテゴリ標準リストとマージするのは負担です.
  • # 카테고리 기준으로 상품리스트 반환하는것과 거의 동일하지만, 카테고리 기준이 아닌 좋아요가 높은 숫자의 상품을 반환하도록 되어 있음.
    class ListByLike(View) :
        def get(self,request,*args) :
            # 좋아요에서 가장 숫자가 높은 친구들 찾기.
            likes = [x["product_id"] for x in list(Like.objects.all().values('product_id'))]
            top6 = [x[0] for x in sorted(list(Counter(likes).items()), key=lambda x : x[1], reverse=True)[:6]]
            likes_lists = [x[1] for x in sorted(list(Counter(likes).items()), key=lambda x : x[1], reverse=True)[:6]]
            product_lists = Products.objects.filter(id__in =top6)
            
            
            idx = 0
            like_boolean = []
            if 'Authorization' in request.headers :
                user_id = get_user_id(self,request)
                like_boolean = [x[2] for x in list(Like.objects.filter(user_id =user_id, product_id__in=product_lists).values_list())]
    
            result = []
            for i in product_lists :
                result.append({
                    "id"            : i.id,
                    "mainImage"     : i.thumbnail_out_url,
                    "subImage"      : i.thumbnail_over_url,
                    "category"      : i.category.name,
                    "name"          : i.name,
                    "cookingTime"   : i.cook_time,
                    "serving"       : i.servings_g_people,
                    "like"          : likes_lists[idx],
                    "this_user_like": int(i.id in like_boolean)
                    }
                )
                idx+=1
            
    
            return JsonResponse({
                "result" : result
            })
    
    

    2.問題とフィードバック


    1.質問


    私自身が考えている問題はこうです.
    1.商品カタログ(カテゴリ)、商品カタログ(良い)、商品詳細ページが重複しているのに、機能別に区分されて関数化されていない.
    2.select related()とプリフェッチrelated()を使用したが、効率を正しく向上させる方法が分からない場合にコードを記述した.
    3.URL Path Parameterを使用してINPUTを入力するデータ型が異なります.したがって、変数名が異なり、
    コードの流れが異なるため、コードをマージする際に問題が発生しました.

    2.フィードバック


    指導者から得られたフィードバックは同じを指しているが、新しい方法を提供している.
    等級を一つにする.バックエンドは、入力/出力に基づいてコードを記述するのではなく、データストリームに基づいてコードを記述する必要があります.
    このフィードバックを聞いて、少しでも良いコードを生成するために、クラスをクラスに統合します.

    3.新しいコード

  • で生成されたPPT画像に置き換えられる.
  • は、まず商品を基準にデータを作成し、入力URL Query paramのキー値が存在するか否かに基づいて、一連の他の操作を開始する.
  • 行以上の動作は、できるだけ外に移動して動作します.
  • は、表示する必要があるデータリストをディック形式で外部に配置して管理し、出力するデータが何のための変数名であるかを管理する.



  • 4.残念(コードのみ)

  • は、それぞれの条件に従ってフィルタ/機能を実現しているため、残念ながら、各リクエストは、すべての機能のキー値を一度チェックしなければならない.
  • フィルタ()を追加し続ける方法を使用しましたが、Qを使用するとorを使用する条件を考慮できますか?したことがあるのが残念です.
  • の複数のモデルにはcreated at/updated atが含まれており、継承用の汎用クラスを作成するとは思わなかった.他のグループの人が使いました.自身の残念な点