좋아요 기능은 포스팅된 글이 주
가 된다고 생각했기 때문에 Postings app에서 작성했습니다.
Like라는 instance에서 참조하는 Account(유저) 누를 posting(게시글). 유저 두가지 user field를 만들었고 이 두가지는 모두 다른 인스턴스를 끌어다 써야하므로 FK field를 사용했다.
class Like(models.Model):
user = models.ForeignKey(Account, on_delete=models.CASCADE)
post = models.ForeignKey(Posting, on_delete=models.CASCADE)
class Meta:
db_table = 'likes'
동일한 Account가 같은 Posting에 두번 누를때는 좋아요를 삭제하는 기능을 추가
좋아요한 유저를 filter해서 count하는 기능 추가
#### 좋아요 기능
class LikeView(View):
def post(self, request):
data = json.loads(request.body)
user = Account.objects.get(pk=data['user'])
post = Posting.objects.get(pk=data['post'])
try:
# 같은 유저가 같은 게시물에 좋아요를 2번 누를 때 좋아요 삭제
if Like.objects.filter(user=user, post=post).exists():
Like.objects.filter(user=user, post=post).delete()
Like.objects.create(
user = user,
post = post,
)
# 좋아요 힙계
like_count = Like.objects.filter(post=post).count()
return JsonResponse({'message': 'SUCCESS', 'like_count': like_count}, status=200)
except KeyError:
return JsonResponse({"MESSAGE":"ERROR"}, status=400)
def get(self, request):
likes = Like.objects.all()
try:
result=[]
for like in likes:
result.append(
{
'name' : like.user_id,
'post' : like.post_id,
}
)
return JsonResponse({"RESULT":result, "MESSAGE":"SUCCESS"}, status=200)
except KeyError:
return JsonResponse({"MESSAGE":"ERROR"}, status=400)
데코레이터를 사용해서 토큰에 user를 담았으면 코드가 더 깔끔해지지 않을까
좋아요 2번을 누르면 좋아요가 아예 삭제되게 구현하는 기능 추가하지 않은 것
개념에 대한 이해없이 우선 동작되게만 하자라는 마인드...(이거 좀 고쳐야겠다 진짜로... 😢)