카테고리 없음
[TIL] DRF, 댓글 model에 대한 고민
째깍단
2023. 6. 7. 21:23
게시글 아래의 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