댓글 API
- url로 보낸 id 값을 받아야 한다.
- 댓글을 조회하면 user는 email
- todo는 title을 보여준다.
(app - models.py) 추가하기
class Comment(models.Model):
user = models.ForeignKey(Users, on_delete=models.CASCADE)
a_todo = models.ForeignKey(Todos, on_delete=models.CASCADE)
content = models.CharField(max_length=256)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
def __str__(self):
return str(self.content)
(app - urls.py) 추가하기
urlpatterns = [
path('<int:todo_id>/comment/', views.CommentView.as_view(), name='comment_view'),
path('<int:todo_id>/comment/<int:comment_id>/', views.CommentDetailView.as_view(), name='comment_detail_view'),
]
(app - serializers.py)
class CommentSerialize(serializers.ModelSerializer):
#시리얼라이저에서 메서드를 호출하여 필드의 값을 결정한다
user = serializers.SerializerMethodField()
todo = serializers.SerializerMethodField()
#여기 메서드 호출
def get_user(self, obj):
return obj.user.email
def get_todo(self, obj):
return obj.a_todo.title
class Meta:
model = Comment
# a_todo를 뺀 나머지 필드
exclude = ('a_todo', )
class CommentCreateSerialize(serializers.ModelSerializer):
class Meta:
model = Comment
fields = ['content', ]
class TodoSerialize(serializers.ModelSerializer):
# 추가하기
# 역참조
# todo 게시글에서도 comment를 보여줌
comment_set = CommentSerialize(many = True)
(app - views.py)
class CommentView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, todo_id):
comment = Comment.objects.all()
serialize = CommentSerialize(comment, many=True)
return Response(serialize.data, status=status.HTTP_200_OK)
def post(self, request, todo_id):
serialize = CommentCreateSerialize(data=request.data)
todo = Todos(id=todo_id)
if serialize.is_valid():
serialize.save(user=request.user, a_todo=todo)
return Response(serialize.data, status=status.HTTP_201_CREATED)
else:
return Response(f'${serialize.errors}', status=status.HTTP_400_BAD_REQUEST)
class CommentDetailView(APIView):
permission_classes = [IsAuthenticated]
def put(self, request, todo_id, comment_id):
comment = get_object_or_404(Comment, id=comment_id)
if request.user == comment.user:
serialize = CommentSerialize(comment, data=request.data)
if serialize.is_valid():
serialize.save()
return Response({"수정됨":serialize.data}, status=status.HTTP_200_OK)
else:
return Response({'message':'권한이 없습니다'},status=status.HTTP_400_BAD_REQUEST)
def delete(self, request, todo_id, comment_id):
comment = get_object_or_404(Comment, id=comment_id)
if request.user == comment.user:
comment.delete()
return Response('댓글 삭제 완료', status=status.HTTP_204_NO_CONTENT)
else:
return Response({'message':'권한이 없습니다'},status=status.HTTP_400_BAD_REQUEST)
'Python > Django' 카테고리의 다른 글
[DRF] 13. 개인페이지 (Q객체, F객체) (0) | 2023.04.27 |
---|---|
[DRF] 12. 좋아요, 팔로우 (1) | 2023.04.26 |
[DRF] 10. 게시글 API (0) | 2023.04.26 |
[DRF] 09. 스태틱, 미디어 폴더 세팅 (0) | 2023.04.26 |
[DRF] 08.5 토큰 주기설정, permission (0) | 2023.04.26 |