본문 바로가기

졸업 프로젝트

게시판 댓글 기능

# 댓글 기능 만들기

 

이전 post 모델을 참조해서 만든다.

 

# models.py

class Comment(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    post=models.ForeignKey(Post, on_delete=models.CASCADE, related_name='comments')
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    content = models.TextField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'[{self.id}]{self.post} :: {self.author}'

 

 

# serializers.py

from rest_framework import serializers
from .models import *

class CommentSerializer(serializers.ModelSerializer):
    author = serializers.ReadOnlyField(source = 'author.nickname')
    class Meta:
        model=Comment
        fields=['id','author','post','content','created_at','updated_at']


class PostSerializer(serializers.ModelSerializer):
    author = serializers.ReadOnlyField(source='author.nickname')
    comment = CommentSerializer(many=True, source='comments', read_only=True) #source=model의 related_name 명시해야 보임

    class Meta:
        model = Post
        fields = ['id', 'author','level','title','tag','group','content','created_at','updated_at','comment']

serializer에서 중요한 점은 comment가 post보다 먼저와야 한다.

postserializer에서 commentserializer를 가져오기 위함. 또 comment model에서 related_name을 명시해줘야 serializer를 이용할 때 필드가 보인다.

 

# views.py

class CommentViewSet(viewsets.ModelViewSet):
    queryset=Comment.objects.all()
    serializer_class=CommentSerializer

    permission_classes = [IsAuthenticated, IsAuthor]

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

 

# urls.py

app_name = 'posts'
router = DefaultRouter()

router.register('post', PostViewSet) #comment list볼러면 설정해줘야함..
router.register('comment',CommentViewSet)

urlpatterns = [
    path('', include(router.urls)),

]

 

게시판 기능과 크게 다를 건 없다

# permissions.py

class IsAuthor(permissions.BasePermission):

    def has_object_permission(self, request, view, obj):

        # 읽기 권한 요청이 들어오면 허용
        if request.method in permissions.SAFE_METHODS:
            return True

        # 요청자(request.user)가 객체(Blog)의 user와 동일한지 확인
        return obj.post.author == request.user

단, 악성 유저 방지를 위해 게시글 작성자는 게시글에 달린 댓글을 자유롭게 수정/삭제가 가능하도록 권한을 바꿔주었다.


# 확인

일단 admin 페이지에서는 잘된다.

 

post에서 댓글까지 조회되는 것을 확인할 수 있다.

 

댓글을 작성하려면 위와 같이 post의 uuid를 직접 명시해주면 된다.

 

수정도 된다. 물론 권한 설정을 해줬으므로 자기가 쓴 댓글만 수정 가능!

 


# API 명세서 작성

이제 진짜 API 명세서를 작성해야한다....생길 수 있는 오류 상황이나 적절한 예시를 모두 넣어서 작성하자.

힘들어
postman

postman으로 만든 API 명세서도 공유할 수 있다. 익숙해지면 이게 더 편한듯...

설정에서 View Documentation 클릭 후 우측 상단의 Publish를 누르면 공유가능한 링크가 나온다.

https://documenter.getpostman.com/view/25425757/2s9YyvBfw2

 

DISLODGED

The Postman Documenter generates and maintains beautiful, live documentation for your collections. Never worry about maintaining API documentation again.

documenter.getpostman.com

와~~

그런데 아마 이 링크는 내가 API를 수정하면 새롭게 Publishing해야 할것이다. 전에 이거 모르고 수정안했다가 프론트한테 혼났당

 


# 회고

 

주요 기능은 끝났다.

아마 배포를 먼저 하고 후순위 기능들(사진, 소셜 로그인, 좋아요 등등...)을 만들지 않을까 싶다.