• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

유저 1명이 1개의 게시글에 좋아요를 누를 경우

23.06.27 18:16 작성 23.06.27 18:32 수정 조회수 243

0

안녕하세요 선생님 강의 매우 재밌게 듣고 있습니다.

커리큘럼 3-3 숫자만 보내고 싶을 때를 수강 하고 난 후, 게시글은 1명의 유저가 1개의 좋아요를 보내고 이미 보냈다면 취소가 되어야 될 것 같다는 생각에 코드를 수정 하고 있었는데요.

사실, 모델링 부분에서 건들지 않으면 위 사항은 자바스크립트의 로컬스토리지나 세션의 개념이 아니고서야 처리가 안될 것 같다는 생각이 드는데, 선생님은 어떻게 생각 하시나요?

만약 모델링을 수정 하고, 위 기능을 고려 한다면 이렇게 접근 할 것 같습니다.

  1. 좋아요 체크 여부 Boolean 필드 생성

  2. 해당 게시글에 좋아요를 누른 경우

  • update 구문에서 좋아요 체크 여부를 True로 변경

  • update 구문 내에서 조건 분기 추가

    • 좋아요 체크가 되어 있지 않다면 숫자 +1

    • 좋아요 체크가 되어 있다면 숫자 -1

    • 좋아요 숫자가 0이라면 0을 그대로 return

      • 이 부분은 PositiveInteger기 때문에 무시해도 되나요?

제가 생각한 접근 방식을 보시고, 선생님의 노하우를 공유 해주셨으면 합니다 감사합니다.

답변 1

답변을 작성해보세요.

1

안녕하세요. 독자님.

게시글에 댓글을 단 사람을 저장하는 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 데코레이터로 기능을 감싸는게 나았을까요?

Very good. 코드 좋아 보입니다. action 사용여부는 익숙한 거 사용하면 되겠지요. 수고했습니다.