Framework/Django

대댓글 작성

JM Lee 2023. 6. 28. 03:03
728x90
class Comment(models.Model):
    parent = models.ForeignKey('self', related_name='reply', on_delete=models.CASCADE, null=True, blank=True)

대댓글 모델을 굳이 추가할 필요 없이, 댓글 모델에 다음과 같이 스스로를 참조하는 코드를 작성하면,

그것이 곧 대댓글이 된다.

 

시리얼라이저에는 다음과 같이 함수를 오버라이딩해서 가져오면 된다.

class CommentSerializer(serializers.ModelSerializer):
    reply = serializers.SerializerMethodField()

    class Meta:
        model = Comment
        fields = ('board', 'id', 'user', 'parent', 'comment', 'created_at','reply')
        read_only_fields = ['user']

	# bind 함수를 통해 지속적으로 대댓글 안 대댓글 작성 가능
    def get_reply(self, instance):
        serializer = self.__class__(instance.reply, many=True)
        serializer.bind('', self)
        return serializer.data

 

함수에는 viewset을 사용할 경우 아래와 같이 작성할 수 있다.

viewset의 기본 기능 중 하나인 create를 사용해서 만들 수 있다.

class CommentViewSet(viewsets.ModelViewSet):
    queryset = Comment.objects.all()
    serializer_class = CommentSerializer
    permission_classes = [permissions.IsAuthenticatedOrReadOnly]

    def perform_create(self, serializer):
        return serializer.save(user=self.request.user)

 

ViewSet을 썼으니 router를 이용하여 url을 작성해주면 대댓글 완성

'Framework > Django' 카테고리의 다른 글

ㅁㄴㅇㄹ  (0) 2023.07.20
장고 50문 50답 채우기(1)  (0) 2023.07.14
장고 Q 사용 (Code Refactoring)  (2) 2023.06.23
taggit 공식 문서 읽어보기  (0) 2023.06.21
Queryset method 정리  (1) 2023.06.20