最初のアイテム実戦
最初のプロジェクトを行う過程で、失敗したところ/感じを振り返ってみましょう.
私はデパートで商品関連のデータモデル/APIを担当しています.
カタログ(カテゴリ)/商品ホームページ/商品詳細ページ/各種ラベル+いいねの「照会」機能が必要な内容です.
ここでは、計画通りに商品をモデリングして、フロントエンドに表示したいデータを直接表示し、ショッピングモールで代表画像を選択して、きれいな商品ページを作成しました.
まず、元のデータを表示するページを作成します.
次のコードに示すように
そして、私は先端の要求に従います.
商品カタログをカテゴリ/詳細ページ/賛順に表示するコードを作成します.
(*このようにテーブルごとにModel.objectsを使用するクラスを3つ作成し、以降他の機能を追加するたびにModel.objectsのみを追加します).
その後、モデル.objectsを呼び出す頻度を減らすためにselect related()、prefetch related()を使用してコードを変更しました.ここから,上に5~6回DBが接続されていると,下に2回減少していることが分かる.
select related()とprefetch related()は何ですか?
次に、使用方法について「粗い」検索と使用を行います.
しかし、これらのコードは実際には有効な認知テストを行うことが難しく(データは20バージョンしかないので効率検査が難しい)、商品ごとに検索機能が重複する機能が多く、入力した値によって、
SQL文のプライマリ・テーブルが変わり、コードのマージも難しくなりました.
各機能を簡単に実装するのに30分もかからない場合があります.
コードは別々なので、効果的に変更するためにselect relatedとprefetch relatedを適用するには長い時間がかかります.
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を適用するには長い時間がかかります.
Reference
この問題について(最初のアイテム実戦), 我々は、より多くの情報をここで見つけました https://velog.io/@nzlk112/1차-프로젝트-2.-실전テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol