最初のアイテム実戦


最初のプロジェクトを行う過程で、失敗したところ/感じを振り返ってみましょう.

1.引き受けた任務


私はデパートで商品関連のデータモデル/APIを担当しています.
カタログ(カテゴリ)/商品ホームページ/商品詳細ページ/各種ラベル+いいねの「照会」機能が必要な内容です.

2.行う


1.初期設定


ここでは、計画通りに商品をモデリングして、フロントエンドに表示したいデータを直接表示し、ショッピングモールで代表画像を選択して、きれいな商品ページを作成しました.
まず、元のデータを表示するページを作成します.
次のコードに示すように

2.ページ固有の機能を生成する


そして、私は先端の要求に従います.
商品カタログをカテゴリ/詳細ページ/賛順に表示するコードを作成します.
(*このようにテーブルごとにModel.objectsを使用するクラスを3つ作成し、以降他の機能を追加するたびにModel.objectsのみを追加します).

3.リフォーム


その後、モデル.objectsを呼び出す頻度を減らすためにselect related()、prefetch related()を使用してコードを変更しました.ここから,上に5~6回DBが接続されていると,下に2回減少していることが分かる.
class DetailByProduct(View) :
    def get(self,request,product_id) :
        
        @login_decorator
        def get_user_id(self,request) :
            return request.user.id
        
        # product 테이블의 ID를 foreignKEY로 사용하는 테이블들을 한번에 가져오기 위해 prefetch_realated사용
        products = Products.objects.select_related('category'
        ).prefetch_related('product_main_images'
        ).prefetch_related('products_hashtag'
        ).prefetch_related('product_detail_attrs'
        ).prefetch_related('like_by_product'
        ).filter(id=product_id)[0]

        likes = products.like_by_product.count()
        
        hash_numbers    = [x['hashtag_id'] for x in list(products.products_hashtag.values('hashtag_id'))]
        hash_names      = [x['name'] for x in list(Hashtags.objects.filter(id__in=hash_numbers).values('name'))]
        detail = [{
            "text"      : i.text,
            "image_url" : i.image_url,
            "priority"  : i.priority,
            } for i in [attr for attr in products.product_detail_attrs.all() if attr.product_id==product_id]]
        

        result = {
            "image"     : products.product_main_images.get(product_id=product_id).main_image_url,
            "category"  : products.category.name,
            "name"      : products.name,
            "likes"     : likes,
            "hashtag"   : hash_names
        }
        
        if 'Authorization' in request.headers :
            user_id                     = get_user_id(self,request)
            like_boolean                = bool([like for like in products.like_by_product.all() if like.user_id==user_id])
            result["this_user_like"]    = int(like_boolean)

        return JsonResponse({
            "result" : [result],
            "detail" : detail
        })

3.後期


select related()とprefetch related()は何ですか?
次に、使用方法について「粗い」検索と使用を行います.
しかし、これらのコードは実際には有効な認知テストを行うことが難しく(データは20バージョンしかないので効率検査が難しい)、商品ごとに検索機能が重複する機能が多く、入力した値によって、
SQL文のプライマリ・テーブルが変わり、コードのマージも難しくなりました.
各機能を簡単に実装するのに30分もかからない場合があります.
コードは別々なので、効果的に変更するためにselect relatedとprefetch relatedを適用するには長い時間がかかります.