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 속성을 지정하였습니다.
# 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()),
]
# 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에 올립니다.
짜잔~