# 댓글 기능 만들기
이전 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으로 만든 API 명세서도 공유할 수 있다. 익숙해지면 이게 더 편한듯...
설정에서 View Documentation 클릭 후 우측 상단의 Publish를 누르면 공유가능한 링크가 나온다.
https://documenter.getpostman.com/view/25425757/2s9YyvBfw2
와~~
그런데 아마 이 링크는 내가 API를 수정하면 새롭게 Publishing해야 할것이다. 전에 이거 모르고 수정안했다가 프론트한테 혼났당
# 회고
주요 기능은 끝났다.
아마 배포를 먼저 하고 후순위 기능들(사진, 소셜 로그인, 좋아요 등등...)을 만들지 않을까 싶다.
'졸업 프로젝트' 카테고리의 다른 글
카테고리 기능 + 배포 (0) | 2024.02.18 |
---|---|
pagination 추가하기 + 배포 준비 (0) | 2024.02.16 |
게시판 기능 (0) | 2024.02.02 |
[Django] Direct assignment to the forward side of a many-to-many set is prohibited. Use groups.set() instead. (0) | 2024.01.31 |
유저 수정 기능 + API 명세서 작성 (0) | 2024.01.29 |