TIL no.37 Westagram Like &Follow

백선호·2021년 8월 1일
1

TIL

목록 보기
34/39
post-thumbnail

이번에는 게시물 좋아요와 좋아요 취소를 하는 기능과 팔로우와 언팔로우 하는 기능을 추가해 보겠다.

Like & Unlike

posts.models.py

class Like(models.Model):
    user  = models.ForeignKey("users.User", on_delete=models.CASCADE)
    post  = models.ForeignKey("Post", on_delete=models.CASCADE)
    like  = models.BooleanField(null=True)

    class Meta:
        db_table = "likes"

어떤 사람이 좋아요를 누르는지 확인하기 위해서 user column을 user 테이블의 외래키로 놓았으며, like는 boolean 필드 속성을 사용하였다.

#posts.viesw.py

class LikeView(View):
    @token_reader
    def post(self, request):
        try:
            data = json.loads(request.body)
            
            post_id = Post.objects.get(title=data['title']).id
            
            if not Post.objects.filter(title=data['title']).exists():
                    return JsonResponse({"message": "NOT_EXIST_POST"}, status=400)
            
            if Like.objects.filter(user=request.user, post=post_id, like='True').exists():
                Like.objects.filter(user=request.user, post=post_id, like='True').delete()
                return JsonResponse({"MESSAGE":"UNLIKE"}, status=201)

            Like.objects.create(
                user = request.user,
                post = Post.objects.get(title=data['title']),
                like = data.get('like')               
            )
            return JsonResponse({"MESSAGE":"SUCCESS"}, status=201)
        
        except KeyError:
            return JsonResponse({"message": "KEY_ERROR"}, status=400)

상위 코드를 살펴보면 첫 번째 조건문은 request.body에 title명이 post 테이블에 저장된 title과 일치하는지 확인을 한다. 두 번째 조건문은 로그인된 사용자, post_id, like=True 이 존재하는지 확인 후 존재한다면 삭제하고 좋아요 취소가 되었다고 반환해 준다. 두 개의 조건문에 걸리지 않았다면 새로운 데이터를 생성한다.

Follow & Unfollow

#posts.models.py

class Follow(models.Model):
    user        = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="follower")
    follow_user = models.ForeignKey("users.User", on_delete=models.CASCADE, related_name="followed_user")

    class Meta:
        db_table = "follows" 

user, follow_user 모두 users.User를 참조한다. 팔로우 하는 사람과 팔로잉 된 사람을 구별하기 위해서 related_name 속성을 사용하여 두 column을 구별한다.

#posts.views.py

class FollowView(View):
    @token_reader
    def post(self, request):
        try:
            data      = json.loads(request.body)
            following = User.objects.get(email = data['followed_user'] ).id

            if Follow.objects.filter(user=request.user, follow_user=following).exists():
                Follow.objects.filter(user=request.user, follow_user=following).delete()
                return JsonResponse({"MESSAGE":"UN_FOLLOW"}, status=201)

            Follow.objects.create(
                user           = request.user,
                follow_user    = User.objects.get(email=data['followed_user'])
            )
            return JsonResponse({"MESSAGE":"SUCCESS"}, status=201)

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

로그인 데코레이터를 사용하였고 좋아요, 좋아요 취소 기능과 동일하게 조건문을 사용하여 이미 database에 존재하면 삭제해서 언팔로우 하는 기능이다. 조건문에 해당되지 않으면 새로운 데이터를 생성한다.

profile
baik9261@gmail.com

0개의 댓글