-
카테고리
-
세부 분야
백엔드
-
해결 여부
해결됨
유저 1명이 1개의 게시글에 좋아요를 누를 경우
23.06.27 18:16 작성 23.06.27 18:32 수정 조회수 243
0
안녕하세요 선생님 강의 매우 재밌게 듣고 있습니다.
커리큘럼 3-3 숫자만 보내고 싶을 때를 수강 하고 난 후, 게시글은 1명의 유저가 1개의 좋아요를 보내고 이미 보냈다면 취소가 되어야 될 것 같다는 생각에 코드를 수정 하고 있었는데요.
사실, 모델링 부분에서 건들지 않으면 위 사항은 자바스크립트의 로컬스토리지나 세션의 개념이 아니고서야 처리가 안될 것 같다는 생각이 드는데, 선생님은 어떻게 생각 하시나요?
만약 모델링을 수정 하고, 위 기능을 고려 한다면 이렇게 접근 할 것 같습니다.
좋아요 체크 여부 Boolean 필드 생성
해당 게시글에 좋아요를 누른 경우
update 구문에서 좋아요 체크 여부를 True로 변경
update 구문 내에서 조건 분기 추가
좋아요 체크가 되어 있지 않다면 숫자 +1
좋아요 체크가 되어 있다면 숫자 -1
좋아요 숫자가 0이라면 0을 그대로 return
이 부분은 PositiveInteger기 때문에 무시해도 되나요?
제가 생각한 접근 방식을 보시고, 선생님의 노하우를 공유 해주셨으면 합니다 감사합니다.
답변을 작성해보세요.
1
김석훈
지식공유자2023.06.27
안녕하세요. 독자님.
게시글에 댓글을 단 사람을 저장하는 User 테이블이 필요해 보입니다.
특정 게시글에 대해서, 동일한 사람이 처음 누르면 댓글 카운트를 +1 하고,
두번째 누르면 -1 하는 로직은 어떨까요 ?
이를 위해 Post : User 테이블간 관계를 N : N 으로 하면 되겠구요.
시도해보면 좋은 경험이 될 것으로 보입니다. 화이팅하세요.
이주환
질문자2023.06.28
views.py snippets
@action(detail=True, methods=["patch"], name="like")
def like(self, request, pk=None):
"""게시물 좋아요 버튼 클릭 했을 때 액션"""
post = self.get_object()
user = request.user
if post.like_people.filter(id=user.id).exists():
post.like_people.remove(user.id)
post.like -= 1
else:
post.like_people.add(user.id)
post.like += 1
post.save()
return Response(status=status.HTTP_200_OK)
models.py
class Post(models.Model):
writer = models.ForeignKey(CustomUser, on_delete=models.CASCADE, help_text="작성자")
title = models.CharField(max_length=500, help_text="제목")
content = models.TextField(help_text="내용")
image = models.ImageField(
upload_to="post/%Y/%m/", blank=True, null=True, help_text="이미지 업로드"
)
like = models.PositiveSmallIntegerField(default=0, help_text="좋아요")
like_people = models.ManyToManyField(
CustomUser, related_name="like_people", help_text="좋아요를 누른 사람들"
)
created_at = models.DateTimeField(auto_now_add=True, help_text="생성 일자")
updated_at = models.DateTimeField(auto_now=True, help_text="수정 일자")
안녕하세요 선생님! 선생님께서 말씀 하신 부분 고려해서 수정 하고 코드 공유 목적으로 올리겠습니다!
ViewSet에서 update를 오버라이딩 하는게 나았을까요? 아니면, 지금 처럼 action 데코레이터로 기능을 감싸는게 나았을까요?
답변 1