DRF로 api 서버 개발(3) - 댓글작성

Dongwon Ahn·2020년 7월 25일
3

DRF로 API Server 개발

목록 보기
4/8
post-thumbnail

댓글 api 만들기

이번 포스트에서는 앞서 만들었던 게시글에 댓글 및 대댓글 api 작업을 진행해보겠습니다.

이번 작업은 앞서 작업했던 boards app에서 진행합니다.

댓글 model 만들기
boards/models.py에 아래 내용을 추가합니다.

class Comment(models.Model):
    board = models.ForeignKey(Board, related_name='comments', on_delete=models.CASCADE)
    user = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE)
    parent = models.ForeignKey('self', related_name='reply', on_delete=models.CASCADE, null=True, blank=True)
    comment = models.CharField(max_length=100)
    created_at = models.DateTimeField('생성시간', auto_now_add=True)
  • parent는 대댓글 작업을 위해 추가된 컬럼입니다.

댓글 serializers 만들기
board/serializers.py에 아래 내용을 추가합니다.

from .models import Board, Comment


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

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

    def get_reply(self, instance):
        serializer = self.__class__(instance.reply, many=True)
        serializer.bind('', self)
        return serializer.data
  • reply는 대댓글이 있을 경우 대댓글 데이터를 볼 수 있도록 추가하였습니다.

SerializerMethodField에 대한 설명은 해당 블로그를 참고해주시면 감사하겠습니다.

댓글 view 만들기
board/views.py 에 아래 내용을 추가합니다.

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)

앞서 진행했던 게시글 생성과 동일하게 perform_create 함수를 새성하여 user 값을 받아옵니다.

댓글 urls 추가
board/urls.py 에 아래 내용을 추가합니다.

router.register(r'comment', views.CommentViewSet)

댓글 Create API Test

http://localhost:8000/boards/comment/
해당 url를 post로 설정한 다음 테스트를 진행해주시면 됩니다.

테스트 전에 model를 변경하였으니 migrate를 해줘야 합니다.

python manage.py makemigrations
python manage.py migrate
## 서버 실행
python manage.py runserver

앞선 게시글 create 테스트와 동일하게 로그인 api의 token값을 가지고 있어야합니다.
Authorization은 아래 이미지와 같이 설정합니다.

body 값은 board에 게시글 pk 값을 설정하여 아래 이미지와 같이 테스트를 진행하면 됩니다.

대댓글 Create API Test

댓글 create에서 대댓을 달 댓글 id 값을 parent에 추가하면 됩니다.
아래 이미지와 같이 테스트가 가능합니다.

댓글 Read API Test

앞서 작업을 viewset을 활용했기 때문에 read api 작업이 가능합니다.
아래 이미지와 같이 테스트가 가능합니다.

Read api 가 가능은 하지만 뭔가 이상한 점이 있습니다.
comment 모델을 따로 만들고 viewset을 활용했기 때문에
read 결과값이 board의 id값이 중심이 아닌 comment 모델의 id값을 중심으로 진행이 됩니다.
그렇기에 다음 포스트에서는 board 중심으로 응답이 나올 수 있도록 변경을 해보겠습니다.

해당 시리즈에서 작업한 코드는 github에 업로드가 되어 있습니다.
부족한 점이나 잘못된 점이 있으면 댓글에 적어주시면 감사하겠습니다.

profile
Typescript를 통해 풀스택 개발을 진행하고 있습니다.

0개의 댓글