이번에는 게시물 좋아요와 좋아요 취소를 하는 기능과 팔로우와 언팔로우 하는 기능을 추가해 보겠다.
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 이 존재하는지 확인 후 존재한다면 삭제하고 좋아요 취소가 되었다고 반환해 준다. 두 개의 조건문에 걸리지 않았다면 새로운 데이터를 생성한다.
#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에 존재하면 삭제해서 언팔로우 하는 기능이다. 조건문에 해당되지 않으면 새로운 데이터를 생성한다.