장고

개발 일지 10 - 댓글 기능 문제 해결

sorecord 2024. 8. 24. 14:59
 count=Comment.objects.all().count()
                print(count)
                if int(parent_comment_id) <= count :# pk를 잘이용하면 될 것 같다. 해당 게시물내에 있는 댓글이어야 한다. 
                    parent_comment = get_object_or_404(Comment, id=parent_comment_id)
                    new_reply.comment = parent_comment
                else:
                    # 대댓글의 대댓글 처리
                    parent_reply_id = request.POST.get('parent_reply_id')
                    print(f"Received parent_reply_id: {parent_reply_id}")
                    if parent_reply_id:
                        parent_reply = get_object_or_404(Comment_Reply, id=parent_reply_id)
                        new_reply.parent = parent_reply
                        # while parent_reply.parent:  # 최상위 부모 댓글 찾기
                        #     parent_reply = parent_reply.parent
                        # new_reply.comment = parent_reply.comment  # 최상위 부모 댓글 설정

                new_reply.save()

 

위의 코드에 문제가 있었다. 

게시글을 한 번 삭제하고 나서 카운트되는 개수가 꼬이면서 해당 게시물에 대댓글이 달리는 것이 아니라 아예 다른 게시물에 대댓글이 달리는 상황이 벌어졌다.

도저히 문제가 해결이 되지 않아서 다른 사람들이 한 것을 찾아보니 다른 사람들은 comment DB를 한 개만 만들어서 대댓글 기능까지 구현을 하고 있다는 사실을 알았다.
 
 

거기서 내가 첫 단추부터 잘 못 꿰었음을 알았다.

지금 문제는 comment_template가 계속 반복되면서 댓글의 위치 아이디를 만들어낸다.

그 아이디를 받아오는데 첫 번째 댓글의 대댓글은 Comment DB에서 값을 가져오고 나머지는 Comment_Reply DB에서 가져와야 했다.
 
간단한 이미지 예시이다.

이 문제를 몇일을 고민했다. gpt에게도 물어보고 인터넷으로 찾아도 보고 나혼자 고민도 했지만 도저히 답이 나오지가 않았다.

pk를 사용해서 현 게시물에 있는 댓글이 아니라면 Comment_Reply DB에서 값을 가져오는 조건문, 게시글 내부에 있는 댓글의 개수를 세서 받아온 parent_id 값이 같거나 작으면 실행하는 조건문등.. 다양하게 고민을 하려 노력했지만 자꾸 문제가 발생했다.
 
 
계속해서 찾다가 try - except 문을 봤다.
직감적으로 해결책이라는 생각이 들었고 아래 코드를 작성했다.
 
 
 try:
     parent_comment = Comment.objects.get( id=parent_comment_id) 
     new_reply.comment = parent_comment
except Comment.DoesNotExist:
     parent_reply_id = request.POST.get('parent_reply_id')
                
    if parent_reply_id:
         parent_reply = get_object_or_404(Comment_Reply, id=parent_reply_id)
         new_reply.parent = parent_reply
첫 번째 댓글을 입력하고 대댓글까지는 try문으로 문제없이 실행이 될 것이다. 그 이후에 들어오는 id값들이 Comment DB에 존재하지 않는다면 Comment_Reply DB로 가서 찾아라 라는 try - except 문을 만들었다.
 
문제없이 해결 되었다.