[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_relatedprefetch_relatedがあります.これにより、キャッシュ内のすべてのロードされていないデータがデータベースに与える影響が減少し、パフォーマンスが向上します.
selected_relatedselected_relatedは、SQL Query文のJOINを使用して外部キー(1対1、複数対1)を使用して正の参照を行い、Query Setのインポート時に関連オブジェクトを事前にロードする関数です.
これにより、データベースへのアクセス頻度を低減できます.
prefetch_relatedselected_relatedはQueryとして関連オブジェクトをロードし、Prefetch_relatedはメインクエリの実行後に個別のクエリを実行する.
次は、何個のクエリーがあるのか、何秒かかったのかを確認する写真です.