Django를 이용하여 게시판의 댓글/대댓글 구현을 하였습니다.
먼저 아래과 같이 모델링을 하였습니다.
대댓글도 결국 댓글이므로 자기 class를 참조하여 parent_comment가 없을 경우 댓글이고, 있을 경우에는 id에 해당하는 댓글의 댓글이 되도록 하였습니다.
class TimeStamp(models.Model): # 생성시간 및 업데이트 시간 생성
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
abstract = True
class Comment(TimeStamp):
content = models.CharField(max_length=500)
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
posting = models.ForeignKey('Post', on_delete=models.CASCADE)
parent_comment = models.ForeignKey('self', on_delete=models.CASCADE, null=True)
class Meta:
db_table = 'comments'
- 댓글 작성 로직
기본적으로 body값으로 댓글 작성에 해당하는 content와 대댓글인지 구분하는 parent_comment_id를 받습니다. (parent_comment_id가 없으면 댓글)
이후 인자값으로 post_id를 전달받아 해당 게시글에 댓글이라는 것을 연결시켜줍니다.
몇 가지 예외처리를 거친 후 이상이 없으면 DB에 저장해주는 방식으로 구현하였습니다.- 예외처리
-. 게시글이 없을 경우POSTING_DOES_NOT_EXIST
반환
-. 게시글 내용이 비어있을 경우EMPTY_CONTENT
반환
class CommentView(View):
@login_decorator
def post(self, request, post_id):
try:
data = json.loads(request.body)
user = request.user
content = data.get("content")
parent_comment_id = data.get("parent_comment_id")
posting = Post.objects.get(id=post_id)
if not Post.objects.filter(id=post_id).exists():
return JsonResponse({"MESSAGE": "POSTING_DOES_NOT_EXIST"}, status=404)
if content == None:
return JsonResponse({"MESSAGE": "EMPTY_CONTENT"})
comment = Comment.objects.create(
user = user,
posting = posting,
content = content,
parent_comment_id = parent_comment_id
)
return JsonResponse({"MESSAGE": "CREATE"}, status=201)
except KeyError:
return JsonResponse({"MESSAGE": "KEY_ERROR"}, status=400)
이번에 댓글/대댓글 작성을 구현하며 depth를 설정하지 못한 것이 조금 아쉬웠습니다. 😭
depth를 설정해주어 대댓글에 대해서는 댓글이 작성되지 않도록 하고 싶었는데, 로직으로 구현하여 예외처리를 하고자 하였으나 get으로 불러오다보니 맞는 값이 없으면 에러가 발생하는 문제가 생겼습니다. 따라서 filter와 exists()를 이용하여 구현하는 방식으로 해보았으나 구현 기한까지의 시간이 부족하여 작성하지 못하여 아쉬웠습니다. 추후 코드를 보완하여 depth까지 구현하도록 노력하겠습니다.💪💪