카테고리 없음

[TIL] DRF, 댓글 model에 대한 고민

째깍단 2023. 6. 7. 21:23

이해를 위한 현재 ERD의 일부

게시글 아래의 comment 모델!

comment - cocomment 로 참조하여 만들기로 하였음

 

 

 

class Comment(models.Model):
    feed = models.ForeignKey(Feed, related_name="comment", on_delete=models.CASCADE)
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="comment_author",
    )
    text = models.CharField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.text


# 대댓글 모델
class Cocomment(models.Model):
    feed = models.ForeignKey(Feed, on_delete=models.CASCADE, related_name="cocomment")
    comment = models.ForeignKey(
        Comment, related_name="cocomment", on_delete=models.CASCADE
    )
    user = models.ForeignKey(
        ...
        related_name="cocomment_author",
    )
    ...이하 동일 ...

 

 

 

이렇게 생성하였는데, serializer와 view를 만들다보니 참조해서 가져오는 것에대한 고민이 든다.

 

#serializers.py
class CocommentSerializer():
    class Meta:
        model = Cocomment
     	...


class CommentSerializer():
    cocomment = CocommentSerializer(required=False)
    class Meta:
        model = Comment
        fields = '__all__'
        extra_kwargs =  { ...
                        'cocomment' : {'read_only': True},
                        }

 

 

 

 

 

 

궁금한 점,

 

1) get할때 한 번에 가져오기위해 cocomment를 comment serializer의 필드로 가져오도록 설정하였는데, 적절한 조치인지 궁금하다

   comment - cocomment 의 관계에 있어서 구분이 필요할까?

  • 장점 : 초보가 쓰기 좋은 방법인 것 같다.
             comment, cocomment 를 테이블을 분리하여 관리가능
  • 단점 : 중복 코드가 늘어난다.
              대댓글 단계를 정해진 모델 수만큼 = 1단계 까지만 만들 수 있다.

 

 

 

2) 'comment - cocomment 의 관계에 있어서 구분이 필요할까?'라는 의문에서, 자기 자신을 참조하는 모델을 작성한다면?

  만약 자기 자신을 참조하는 모델이라면 Read(get)할 때는 물론이고
  CUD과정에서도 여러 id값이나 복잡한 url을 필요로 하지 않을 것 같다.

 

  • 장점 : comment에 대한 view, serializer 등을 한 번만 작성하면 된다!
              'comment / cocomment'는 cocomment에 아주 약간의 코드 추가만 있을 뿐 거의 동일하기 때문.
  • 단점 : 아직 이런 방식으로 구현 및 사용해 본 바가 없어서 어떤 방식으로 데이터를 가져오는지 알지 못한다.
              테스트 아직 못해봐서 제대로 작동하는지 아닌지도 모른다ㅋㅋ! 잘 알고 써야할 것 같다!
  • 고민거리 :
    + 어떻게 comment와 cocomment를 구분해줄것인가?
    + 너무 많은 대댓글이 생성되는 것을 어떻게 막아줄지에 대한 고민이 필요함
# 댓글 - 자기자신을 참조하는 댓글 모델
class Comment(models.Model):
    feed = models.ForeignKey(Feed, related_name='comment', on_delete=models.CASCADE)
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='comment_author')
    comment = models.ForeignKey(Comment, related_name='parent_comment', on_delete=models.SET_NULL, null=True)
    text = models.CharField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.text