最初のアイテムひっくり返す
以前に作成したビューは、約2日間のモデリングを組み合わせた結果です.
フロントの友人に見せるために30分以内にデータベースを作成したが、データベース接続回数を減らし、効率を高めるために、それなりの改造も行われた.
しかし結局ひっくり返され、以前のコードと後のコードを比較したいと思います.
URLpathprameerで受信した「カテゴリ」値を基準とします. 商品の1つの属性は「Category」表を参照し、select relatedを一度に呼び出しています. 商品については、1:N条件の「Like」テーブルを複数回使用する必要があります.DB接続が複数回発生しないように、使用可能なデータを一度にロードします. URLPATHにて商品IDを取得し、これを基準として処理を行った.
1.N:N関係のラベル
2.. 1:Nは仲が良くて、詳しいピクチャー
3.. 逆参照関係の詳細
一度のロードのためにDjangoが提供するプリフェッチ相関()を使用した. それぞれの基準が違うので、それぞれ違うテーブルを持ってきます. 以降は、規格ごとに商品IDを取得し、商品IDに基づいてカテゴリをソートしていると思いますが、ほぼ同じです・・・コードに微妙な変化(属性名など)が発生し、いくつかの機能を関数として減算し、カテゴリ標準リストとマージするのは負担です.
私自身が考えている問題はこうです.
1.商品カタログ(カテゴリ)、商品カタログ(良い)、商品詳細ページが重複しているのに、機能別に区分されて関数化されていない.
2.select related()とプリフェッチrelated()を使用したが、効率を正しく向上させる方法が分からない場合にコードを記述した.
3.URL Path Parameterを使用してINPUTを入力するデータ型が異なります.したがって、変数名が異なり、
コードの流れが異なるため、コードをマージする際に問題が発生しました.
指導者から得られたフィードバックは同じを指しているが、新しい方法を提供している.
等級を一つにする.バックエンドは、入力/出力に基づいてコードを記述するのではなく、データストリームに基づいてコードを記述する必要があります.
このフィードバックを聞いて、少しでも良いコードを生成するために、クラスをクラスに統合します.
で生成されたPPT画像に置き換えられる. は、まず商品を基準にデータを作成し、入力URL Query paramのキー値が存在するか否かに基づいて、一連の他の操作を開始する. 行以上の動作は、できるだけ外に移動して動作します. は、表示する必要があるデータリストをディック形式で外部に配置して管理し、出力するデータが何のための変数名であるかを管理する.
は、それぞれの条件に従ってフィルタ/機能を実現しているため、残念ながら、各リクエストは、すべての機能のキー値を一度チェックしなければならない. フィルタ()を追加し続ける方法を使用しましたが、Qを使用するとorを使用する条件を考慮できますか?したことがあるのが残念です. の複数のモデルにはcreated at/updated atが含まれており、継承用の汎用クラスを作成するとは思わなかった.他のグループの人が使いました.自身の残念な点
フロントの友人に見せるために30分以内にデータベースを作成したが、データベース接続回数を減らし、効率を高めるために、それなりの改造も行われた.
しかし結局ひっくり返され、以前のコードと後のコードを比較したいと思います.
1.前のコードを置換
1.商品リストAPI(byカテゴリ)
# 카테고리, 메뉴이름, 조리시간, 몇인분인지, 좋아요 개수
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.商品詳細ページ
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.カタログ(いいね基準、優先度基準、検索語基準)
# 카테고리 기준으로 상품리스트 반환하는것과 거의 동일하지만, 카테고리 기준이 아닌 좋아요가 높은 숫자의 상품을 반환하도록 되어 있음.
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.新しいコード
4.残念(コードのみ)
Reference
この問題について(最初のアイテムひっくり返す), 我々は、より多くの情報をここで見つけました https://velog.io/@nzlk112/1차-프로젝트-3.-갈아-엎기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol