본문 바로가기

내일 배움 캠프/TIL

대댓글 기능 만들기


대댓글 기능 만들기

먼저 모델을 만들어 주자. 기존의 Comment 모델과 다른점이라면 Comment 모델을 Foreignkey로 받아온다는 점이다. 어떤 댓글에 대댓글을 달았는지 알아야 하니까 ..

# blogs/models.py

class ReComment(models.Model):
    """대댓글"""
    
    user = models.ForeignKey(User, on_delete=models.CASCADE, verbose_name="작성자") 
    article = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name="게시글")
    comment = models.ForeignKey(Comment, on_delete=models.CASCADE, related_name="recomments")
    recomment = models.TextField(null=False, verbose_name="대댓글")
    created_at = models.DateTimeField(auto_now_add=True, verbose_name="작성일")
    
    def __str__(self):
        return self.recomment

 

 

 

모델을 만들어 주었다면 serializer를 손볼 차례다. 대댓글을 쓸때 사용하는 serializer를 추가해주고 해당 게시글 댓글을 보여주는 serializer도 수정해주어야 한다. ( 기존것은 댓글만 보이기 때문에 대댓글이 있는것들은 대댓글도 같이 출력되도록 바꿔야한다! )

# blogs/serializers.py

class ReCommentSerializer(serializers.ModelSerializer):
    class Meta:
        model = ReComment
        fields = ("id","user","recomment","created_at")
        




# 수정 전 CommentSerializer
class CommentSerializer(serializers.ModelSerializer):

    """Comment Serializer"""

    class Meta:
        model = Comment
        fields = ("id","user", "comment", "created_at", "article")


# 수정 후 CommentSerializer
class CommentSerializer(serializers.ModelSerializer):
    recomments = ReCommentSerializer(many=True)

    """Comment Serializer"""

    class Meta:
        model = Comment
        fields = ("id","user", "comment", "created_at", "article", "recomments")

 

 

 

마지막으로 view함수만 작성하면 끝! 기존의 댓글을 다는 함수와 거의 다른점이 없다. 

# blogs/views.py

class ReCommentView(APIView):
    
    def post(self, request, article_id, comment_id):
        """대댓글 작성"""
        
        serializer = ReCommentCreateSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(
                user=request.user, article=Article.objects.get(pk=article_id), comment=Comment.objects.get(pk=comment_id)
            )
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        else:
            return Response(serializer.errors, status=status.HTTP_401_UNAUTHORIZED)

 

 

 

결과

대댓글이 있는 댓글에도 잘 나오는걸 볼 수 있다!!

 

추후에 언급 기능을 만들껀데 그건 프론트에서 작업을 해야할꺼같다..