Django Assignment 1 | Westagram 8)

김기현·2022년 2월 24일
0
post-thumbnail

[Mission 9] 게시물 '좋아요' 기능 구현

미션

  • Postings app 활용
    포스팅하는 게시물과 좋아요 기능을 같은 앱에서 관리하거나, postings앱과likes앱을 분리하여 관리할 수도 있는데, posting 앱에서 두 데이터를 관리합니다.

  • Like Model 생성
    인스타그램의 게시물을 좋아요하기 위해서는 좋아요한 게시물과 유저가 포함되어야 합니다.
    Foreign Key를 이용하여 유저와 게시물 사이의 관계를 만들어 주세요.

  • Like View 생성
    좋아요를 할 때에는 post메소드를 사용합니다.
    이미 좋아요한 게시물을 해당 유저가 또 좋아요했을 경우도 대비해주세요.

  • Urls.py 작성
    클라이언트의 요청을 받아서 좋아요 뷰를 호출할 수 있도록 urls.py 를 작성해 주세요.

수정 사항들 내용

  • 모델링
# postings/models
class Like(TimeStampedModel):
    user = models.ForeignKey('users.User', related_name='likes', on_delete=models.PROTECT) 
    post = models.ForeignKey('Post', related_name='likes', on_delete=models.CASCADE)

    class Meta:
        db_table = "likes" 

유저가 삭제되어도 좋아요는 유지되도록, 포스팅이 삭제되면 좋아요도 삭제되도록 on_delete 속성을 지정하였습니다.

  • url
# postings/urls
from django.urls import path
from .views import PostingView, CommentView, LikeView

urlpatterns = [
    path("upload", PostingView.as_view()),
    path("comment", CommentView.as_view()),
    path("like", LikeView.as_view()),
] 
  • views
# postings/views
class LikeView(View):
    def post(self, request):
        try:        
            data = json.loads(request.body)
            post_id    = data['post_id'] 
            payload = jwt.decode(data["token"], SECRET_KEY, ALGORITHM)
            user_id    = payload['user_id']

            if not User.objects.filter(id = user_id).exists():
                return JsonResponse({'MESSAGE': "User Does Not Exist"}, status=404)    

            if not User.objects.filter(id = post_id).exists():
                return JsonResponse({'MESSAGE': "Post Does Not Exist"}, status=404)    

            if Like.objects.filter(user = user_id, post=post_id).exists():
                return JsonResponse({'MESSAGE': "Already Liked Post"}, status=404)    

            Like.objects.create(
                user_id = payload['user_id'],
                post_id = post_id,
            )
            return JsonResponse({'messasge':'SUCCESS'}, status=201) 

        except KeyError:
            return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=400)

만약 user가 user_id와 같고, post가 post_id와 같다면 이미 좋앟하는 포스트이므로 적절한 메시지를 반환합니다.

조건들을 다 거쳤다면 좋아요를 누를 수 있는 여건이 충족하므로, Like에 올립니다.

짜잔~

profile
피자, 코드, 커피를 사랑하는 피코커

0개의 댓글