endpoint
는 '보고 싶어요' 기능에 맞게 watchlist
로 구성했다
from django.urls import path
from users.views import SignUpView, SignInView, WatchListView, UserView
urlpatterns = [
...
path('/watchlist', WatchListView.as_view()),
]
직관적인 코드를 위해 get_or_create
메서드를 사용하였다.
열심히 구글링 하다가 이번에 처음 알게된 메서드인데,
좋아요 기능을 구현할 떄 매우 유용하다.
get_or_create
- return 할 때는 (
object
,is_created
)의tuple
형식으로 반환한다.object
는 검색하고자 하는 모델의 인스턴스이다.is_created
는 위의 인스턴스가 생성 되었는지/아닌지 알려주는 불리언 타입의flag
이다.
WatchList
클래스는, Film
과 User
의 외부 키를 갖고 있는 상태이다.
class WatchList(models.Model):
film = models.ForeignKey(Film, on_delete=models.CASCADE)
user = models.ForeignKey('User', on_delete=models.CASCADE)
class Meta:
db_table = 'watch_lists'
그래서 실제 WatchList
모델에 적용하여,
해당 필드에 user_id
에 film_id
없으면 생성하고, 있으면 삭제하는 식이다.
from django.http import JsonResponse
from django.views import View
from users.models import WatchList
from films.models import Film
from core.utils import token_decorator
class WatchListView(View):
@token_decorator
def post(self, request):
try:
data = json.loads(request.body)
if not Film.objects.filter(id = data['film_id']).exists:
return JsonResponse({'message' : 'FILM_DOES_NOT_EXIST'}, status = 404)
film = Film.objects.get(id = data['film_id'])
user = request.user
wish, is_created = WatchList.objects.get_or_create(film = film, user = user)
if not is_created:
wish.delete()
return JsonResponse({'message' : 'WATCH_LIST_DELETED'}, status = 204)
return JsonResponse({'message' : 'SUCCESS'}, status = 201)
except KeyError:
return JsonResponse({'message' :'KEY_ERROR'}, status = 400)
ipconfig getifaddr en0
를 통해 ip 주소 확인
python manage.py runserver 0:8000
로 해당 ip 주소로 서버 열기
로그인하여 토큰 발급
예시로 film_id
를 23을 넣었다.
로그인한 계정의 user_id
가 1인데, 성공적으로 잘 저장 되었다
mysql> select * from watch_lists;
+-----+---------+---------+
| id | film_id | user_id |
+-----+---------+---------+
...
| 156 | 11 | 50 |
| 157 | 25 | 50 |
| 159 | 23 | 1 |
+-----+---------+---------+
37 rows in set (0.00 sec)
삭제 확인 완료
mysql> select * from watch_lists;
+-----+---------+---------+
| id | film_id | user_id |
+-----+---------+---------+
...
| 156 | 11 | 50 |
| 157 | 25 | 50 |
+-----+---------+---------+
36 rows in set (0.00 sec)
보고 싶어요
의 기능에 대하여 boolean
타입을 판별해야 한다.WatchList
에 대한 boolean
타입을 True
로 넣어 놨다...True
가 되어 있기 때문에 상세페이지를 새로 고침할 때마다 항상 기호가 +
로 항상 나.온.다.Watcha Classic 영상 링크, 3분 10초부터
아래 사진에서 해당 회원은 이미 영화 '미망인'을 보고 싶어요를 누른 상태이다.
그러나 미망인을 클릭할 경우 목데이터로 default
값이 True
이기에 담겨 있어도 +
기호로 되어 있다.
Database 상에는 문제가 없으나 client는 그것을 모르기에, 문제가 된다.
하... 이거는 도저히 11일 동안의 프로젝트 후반부이기에 구현하지 못했다...😭😭😭