[WatchaPedia Clone] Day 7. コード再構築


付加機能の実装では,collection機能を迅速に修正し,フロントと連携して進捗を進め,可読性の悪いコードや無効なコードに対するコードコメントを反映し,再構築を開始した.既存の機能において他のAPIでも再利用可能な演算を個別に関数化したり、長符号を無意味に減らしたり、各種の約定を遵守するように修正したりした.
convention
  • 相関nameは複素数,
  • である.
    class Archive(models.Model):
    	user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='archived_movie')
    既存のForeign Keyリファレンスを使用する場合、上記の形式で関連するnameを指定しますが、前述のようにviewsです.pyで使用すると外部キーと区別されないので分かりやすいので複数形で記入した方が読みやすさが良いです.そこで以下のように修正します.
    class Archive(models.Model):
    	user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='archived_movies')
  • 関数名は動詞型で始まり、
  • Archive/utilsは、複数のAPIにおいて、各映画の平均スコアを計算する機能を使用している.py内の関数を独立して構成します.
    この過程で、初めて関数名をratings_calcと命名し、ある機能を동작수행と命名する意味をさらに強調するために、関数名をcalculate_ratingsに変更した.
    利用list comprehension
    results = []
    
    for rating in ratings:
    	results.append(
    		{
    			"id"      : rating.id,
    			"user_id" : rating.user_id,
    			"user"    : rating.user.username,
    			"content" : rating.content.title_korean,
    			"rating"  : rating.rating
    		}
    	)
    前述したように、複数のデータを読み出してテーブルに格納して転送する場合、リストを宣言した後、単一のfor文ではなくlist comprehensionを使用してテーブルにデータを格納することで、より直感的でパフォーマンスの良いコードを記述することができる.
    results = [{
    	"id"      : rating.id,
    	"user_id" : rating.user_id,
    	"user"    : rating.user.username,
    	"content" : rating.content.title_korean,
    	"rating"  : rating.rating
    } for rating in ratings]
    正参照&逆参照の呼び出し
    変数getにデータ・アイテムを割り当て、その変数に関連付けられた外部テーブルのアイテムにアクセスする場合、既存の変数を使用して参照または逆参照のポイントに接続することは、テーブルで条件検索を再実行するよりも可能です.
    この点については、上記のrelated_nameを含め、多くの概念が言及されているので、それらを単独で削除し、既存のコードで正の参照、逆の参照呼び出しで再パッケージされたコードを紹介し、スキップします.
    "user"    : User.objects.get(id=rating.user_id).username,
    "content" : Content.objects.get(id=rating.content_id).title_korean,
    以前は上記の方法で各格付け項目が参照するuserとcontent情報をロードし、データを再抽出していたが、上記の場合、格付けがuserとcontentをそれぞれ参照している場合、以下の方法でコードを修正し、よりきれいに書くことができる.
    "user"    : rating.user.username
    "content" : rating.content.title_korean
    auto_now & auto_now_add
    既存のコードには、データ生成時間(created_at)と修正時間(updated_at)がそれぞれ表示される.now()関数を用いた.しかし、モデルは以下の通り.pyで変更すると、作成と変更時間をより簡単に表示できます.
    created_at  = models.DateTimeField(auto_now_add=True)
    updated_at  = models.DateTimeField(auto_now=True)
    get_or_create
    if Review.objects.filter(user = user, content = content).exists():
    return JsonResponse({"message": "ALREADY_EXIST"}, status = 400)
    
    Review.objects.create(user = user, content = content, body = body)
    return JsonResponse({"message": "SUCCESS"}, status = 201)
    新しいデータを作成する過程で、既存のデータが存在しない場合はデータを作成し、存在する場合はエラーメッセージを送信し、この過程でif文を毎回使用してデータが存在するかどうかを検証したことがある.しかし、この方法ではなくDjango queryset APIのget_or_createを利用することができる.
    review, created = Review.objects.get_or_create(user    = user, 
                                                   content = content)
    if created:
    	review.body = data['body']
    	review.save()
    	return JsonResponse({"message": "SUCCESS"}, status = 201)
    return JsonResponse({"message": "ALREADY_EXIST"}, status = 400)
    上記の方法を用いて、(object, created)形のブラウスを返却する.最初のobjectはgetによって取得されたオブジェクトまたは既存の値がないために新規に作成されたオブジェクトであり、createは上記の方法で新しいオブジェクトが作成されたかどうかをブール形式で表示します.(True:objectは値を取得できないため、新規作成//Filse:既存のオブジェクトから値を取得)したがって、上記のコードはcreateに新規値を作成したときにデータを格納して成功メッセージを送信し、そうでなければ「ALREAD EXIST」メッセージを送信する.