2차 프로젝트에서 제가 담당한 기능 중 하나는 바로 좋아요 기능
입니다.
좋아요 기능을 구현하면서 처음에는 댓글처럼 post함수와 delete함수를 따로 만들어야겠다고 생각했습니다.
하지만 생각해보니 좋아요의 경우 댓글과 달리
기존에 강의에 좋아요를 누르지 않았으면 좋아요가 생성
되고
기존에 강의에 좋아요를 누른 상태에서 또 누르면 좋아요가 삭제
되는 방식으로 기능을 구현해야 했습니다.
해당 부분을 어떻게 구현할까 고민하다 get_or_create
메소드를 사용하였습니다.
class LikeView(View):
@Authorize
def post(self,request,course_id):
try:
like, is_like = Like.objects.get_or_create(course_id=course_id, user_id=request.user.id)
if not is_like:
like.delete()
return JsonResponse({"message" : "DELETE_LIKE"}, status=200)
return JsonResponse({"message" : "SUCCESS_LIKE"}, status=200)
except IntegrityError:
return JsonResponse({"message": "INVALID_VALUE"}, status=401)
get_or_create
의 경우 (objects, created) 라는 튜플형식으로 반환을 합니다.
두번째 인자인 created는 boolean flag
인데 첫번째 objects가 존재하면 True
를 반환하고 존재하지 않으면 False
를 반환합니다.
Like.objects.get_or_create(course_id=course_id, user_id=request.user.id)
if not is_like:
like.delete()
즉, 위 코드는 지금 로그인한 유저(user_id=request.user.id)가 해당 강의(course_id=course_id)에 좋아요를 누르지 않았으면 is_like가 true
가 되면서 좋아요가 생성되고 이미 좋아요를 누른 상태면 is_like가 false
가 되면서 댓글이 삭제됩니다(like.delete()
)