[PROJECT] AIRBNB CLONING #4
Room Detail API
「スタジオDetail」ページでは、Superhost、ユーザーイメージ、セキュリティと便利な施設、保存、チェックイン日、宿泊日、コメントとコメントにアクセスする画像、場所、宿泊ルールなどの情報を確認する必要があります.複数のAPIが1ページに統合され、分割されます.
具体的なAPIコードは以下の通りである.
config/urls
from django.urls import path, include
urlpatterns = [
path("rooms", include('rooms.urls')),
]
rooms/urls
from django.urls import path
from rooms.views import RoomDetailView
urlpatterns = [
path('/<int:room_id>', RoomDetailView.as_view()),
]
Path Paramterが適用されました.idが1のroomのuriは/rooms/1
である.rooms/views
from django.http import JsonResponse
from django.views import View
from rooms.models import Room, RoomAmenity, RoomHouseRule
class RoomDetailView(View):
def get(self, request, room_id):
if not Room.objects.filter(id=room_id).exists():
return JsonResponse({'message': 'ROOM_DOES_NOT_EXIST'}, status=404)
room = Room.objects.select_related('category')\
.prefetch_related('room_amenities', 'room_houserules', 'room_images', 'room_schedules').get(id=room_id)
result = {
"name" : room.name,
"description" : room.description,
"district" : room.district,
"neighberhood" : room.neighberhood,
"price" : float(room.price),
"address" : room.address,
"guests" : int(room.guests),
"beds" : room.beds,
"bedrooms" : room.bedrooms,
"baths" : room.baths,
"latitute" : float(room.latitute),
"longitute" : float(room.longitute),
"host" : room.user.nickname,
"host_image" : room.user.profile_image,
"category" : room.category.type,
"room_images_url" : [image.image_url for image in room.room_images.all()],
"check_in" : [schedule.check_in for schedule in room.room_schedules.all()],
"room_amenities" : [{
"amenity_id" : amenity.id,
"amenity_name" : amenity.amenity.name,
"amenity_icon_url" : amenity.amenity.icon_url,
}for amenity in RoomAmenity.objects.filter(room_id=room_id)],
"check_in_time" : room.check_in_time,
"check_out_time" : room.check_out_time,
"house_rules" : [{
"room_rules" : rules.house_rule.name,
"rules_icon_url" : rules.house_rule.icon_url,
}for rules in RoomHouseRule.objects.filter(room_id=room_id)]
}
return JsonResponse({'message' : result}, status=200)
selected_related
およびprefetch_related
を使用してDjangoのORMを最適化した.ORM
ORMは、オブジェクトとリレーショナル・データベースのデータ・マッピングを表します.要約すると、データベースとオブジェクト向けプログラミング言語との間で互換性のないデータを変換するためのプログラミングテクニックです.
Django ORMを使用すると、Queryの数を減らすために
select_related
とprefetch_related
があります.これにより、キャッシュ内のすべてのロードされていないデータがデータベースに与える影響が減少し、パフォーマンスが向上します.selected_related
selected_related
は、SQL Query文のJOINを使用して外部キー(1対1、複数対1)を使用して正の参照を行い、Query Setのインポート時に関連オブジェクトを事前にロードする関数です.これにより、データベースへのアクセス頻度を低減できます.
prefetch_related
selected_related
はQueryとして関連オブジェクトをロードし、Prefetch_related
はメインクエリの実行後に個別のクエリを実行する.次は、何個のクエリーがあるのか、何秒かかったのかを確認する写真です.
Reference
この問題について([PROJECT] AIRBNB CLONING #4), 我々は、より多くの情報をここで見つけました https://velog.io/@tritny6516/PROJECT-AIRBNB-CLONING-4テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol