[PROJECT] AIRBNB CLONING #5


Wishlist API



部屋を保存すると、必要な名前の希望リストを作成してフォルダに保存できます.したがって、モデリングではwishlistという名前のテーブルには名前とユーザーのテーブルが必要であり、wishlistroomという名前の中間テーブルには部屋と所望のリストを接続する必要があります.

users/urls

from django.urls import path
from users.views import KakaoSignIn, WishlistView

urlpatterns = [
    path("/login/kakao", KakaoSignIn.as_view()),
    path("/wishlist", WishlistView.as_view()),
]

users/views

import json, jwt, requests, datetime

from django.views     import View
from django.http      import JsonResponse

from rooms.models import Room
from users.models import User, Wishlist, WishlistRoom
from core.utils   import login_decorator
from my_settings  import SECRET_KEY, ALGORITHM

class WishlistView(View):
    @login_decorator
    def post(self, request):
        try:
            data      = json.loads(request.body)
            room_id   = data['room_id']
            list_id   = data['list_id']
            list_name = data['list_name']
            
            rooms = Room.objects.get(id=room_id)
            user = request.user

            if not Wishlist.objects.filter(id=list_id, user=user).exists():
                wishlist = Wishlist.objects.create(
                    user = user,
                    name = list_name
                )
            else:
                wishlist = Wishlist.objects.get(id=list_id, user=user)
                
            WishlistRoom.objects.create(
                room     = rooms,
                wishlist = wishlist
            )
            return  JsonResponse({'message' : 'LIKED'}, status = 201)
            
        except KeyError:
            return JsonResponse({'message' : 'KEY_ERROR'}, status = 400)        
        except Room.DoesNotExist:
            return JsonResponse({'message' : 'ROOM_DOES_NOT_EXIST'}, status = 400)
bodyには、jsonで送信されるroom_idlist_id、およびlist_nameのエントリが含まれている.userlogin_decoratorのリクエストです.userとして使用され、wishlistを保存する必要があるため、id=room_idに指定されています.
Wishlistにオブジェクトがない場合は、オブジェクトを作成します.そうでない場合は、オブジェクトを取得します.中間テーブルwishlistroomの論理も作成します.
エラーを回避するために、適切な例外処理を提供しました.