반응형
댓글,대댓글 모델 정의
# models.py
class Comment(TimeStampedModel, models.Model):
post = models.ForeignKey('Post', related_name='comments', on_delete=models.CASCADE)
user = models.ForeignKey(User, related_name='comments', on_delete=models.CASCADE)
content = models.TextField()
created_at = models.DateTimeField(auto_now_add=True)
root = models.ForeignKey('self', related_name='root_comment', on_delete=models.CASCADE, null=True, blank=True)
def __str__(self):
return '{} : {}'.format(self.author, self.cotent)
class Meta:
ordering = ['-created_at']
root는 대댓글을 위해서 만들어둔 필드이다. 추후serializers 사용한다.
serializers 만들기
# serializers.py
class CommentSerializer(serializers.ModelSerializer):
root_comment = serializers.SerializerMethodField()
user = serializers.ReadOnlyField(source='user.nickname')
class Meta:
model = Comment
fields = ['id', 'post', 'user', 'content', 'created_at', 'root_comment']
def get_root_comment(self, instance):
serializer = self.__class__(instance.root_comment, many=True)
serializer.bind('', self)
return serializer.data
user의 경우 jwt를 이용하여 유저 정보를 가지고 오기 때문에 readonly 값으로 넣어주었다.
root_comment를 이용하여 대댓글이 있을 경우 대댓글을 볼 수 있다.
ViewSet
from rest_framework_simplejwt.authentication import JWTAuthentication
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework import viewsets
from recipes.permissions import IsOwnerOrReadOnly
from .serializers import CommentSerializer
from accounts.functions import get_user_id
from .models import Comments
class CommentViewSet(viewsets.ModelViewSet):
authentication_classes = [JWTAuthentication]
permission_classes = [IsAuthenticatedOrReadOnly, IsOwnerOrReadOnly]
queryset = Comments.objects.all()
serializer_class = CommentSerializer
def perform_create(self, serializer):
serializer.save(user=get_user_id(self.request))
get_user_id의 경우 jwt 토큰을 이용하여 user instance를 리턴해주는 함수이다.
urls.py
from django.urls import path, include
from .viewsets import CommentViewSet
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('', CommentViewSet, basename='comment')
urlpatterns =[
path('', include(router.urls)),
]
PostSerializer에서 Comment 추가
다른분들이 진행한 코드를 보면 아래 접은글처럼 구현을 했는데, API를 날려보니 댓글이 Post에 표시가 되지 않아서 내 입맛대로 변경하였다.
더보기
# 다른분이 진행한 내용
class PostSerializer(serializers.ModelSerializer):
comments = CommentSerializer(many=True, read_only=True)
class Meta:
model = Post
fields = ('title', 'content', 'comments')
# 내 코드
class PostSerializer(serializers.ModelSerializer):
comments = serializers.SerializerMethodField()
class Meta:
model = Post
fields = ('title', 'content', 'comments')
def get_comments(self, data):
comment = Comments.objects.filter(recipe=data.id)
serializer = CommentSerializer(comment, many=True)
return serializer.data
출처
반응형
'Django, DRF' 카테고리의 다른 글
venv 가상환경 명령어 (0) | 2024.04.09 |
---|---|
[Method] DRF PUT과 PATCH의 차이점 (0) | 2024.04.03 |
[Authentication] DRF Authentication, Permission (인증, 권한) (0) | 2024.03.20 |
[View] DRF CBV 뷰의 종류와 차이점 (APIView, Mixins, Generic APIView, ViewSet) (2) | 2024.03.19 |
django.urls.exceptions.NoReverseMatch: Reverse for 'account_inactive' not found. 'account_inactive' is not a valid view function or pattern name. (0) | 2023.12.04 |