Assignment #1 | Westagram [Mission 9] 좋아요 기능 구현

Jayson Hwang·2022년 5월 21일
0

Westagram Project

목록 보기
10/11
post-thumbnail

1.. Postings app 활용

  • 바라보는 관점에 따라 같은 앱에서 관리할 수도, 따로 분리하여 관리할 수도 있음
  • 이번 프로젝트에서는 모두 같은 앱(postings)에서 관리

2.. models.py

from django.db    import models
from users.models import User

class TimeStampModel(models.Model): 
    created_at = models.DateTimeField(auto_now_add = True)
    updated_at = models.DateTimeField(auto_now = True)
    
    class Meta: 
        abstract = True

class Like(TimeStampModel):
    user = models.ForeignKey('users.User', on_delete=models.CASCADE)
    post = models.ForeignKey('Post', on_delete=models.CASCADE)
    
    class Meta: 
        db_table = 'likes'
  • postuser를 둘다 foreignkey로 지정해주었음
  • 다른 방법으로는 ManyToManyField를 지정하는 것도 가능
    관련해서는 다음 블로그를 참조
  • 모델 작성 완료 후 makemigartions, migrate 진행

3.. views.py

📌 내가 작성한 Like View 코드

class LikeView(View):
    @signin_decorator
    def post(self, request):
        try: 
            data = json.loads(request.body)
            user = request.user
            post_id = data['post']

            if not Post.objects.filter(id = post_id).exists():
                return JsonResponse({'message':'POSTING_DOES_NOT_EXIST'}, status=404)
            
            post = Post.objects.get(id=post_id)

            if Like.objects.filter(user = user, post=post).exists():
                Like.objects.filter(user=user, post=post).delete()
                like_count = Like.objects.filter(post=post).count()
                return JsonResponse({'message':'SUCCESS', 'like_count' : like_count}, status=200)
            ## 요청받은 유저와 게시글이 일치하는 것 중 
            ## "좋아요"가 눌린 데이터가 DB에 있는지 먼저 확인하고,
            ## "좋아요"가 눌렸다면 해당 데이터를 삭제(.delete())
            ## 그리고 좋아요 개수를 카운트한다.

            Like.objects.create(
                user = user,
                post = post
            )
            like_count = Like.objects.filter(post=post).count()
            ## 만약 해당하는 게시글에 대한 "좋아요" 데이터가 DB에 없다면
            ## 바로 DB에 추가!
            ## 그 후, 좋아요 개수 카운트한다.
            
            return JsonResponse({'message':'SUCCESS', 'like_count' : like_count}, status=200)
        
        except KeyError: 
            return JsonResponse({"message": 'KEY_ERROR'}, status=400)

4..URLconf

postings/urls.py

from django.urls import path
from postings.views import PostView, CommentView, LikeView

urlpatterns = [
    path('/post', PostView.as_view()),
    path('/comment/<int:post_id>', CommentView.as_view()),
    path('/post/like', LikeView.as_view()),
]

profile
"Your goals, Minus your doubts, Equal your reality"

0개의 댓글