어제 DB 모델링 및 admin 페이지 커스터마이징을 마친 뒤 API 설계를 진행하였다.

현재 구현한 기능으로는 API 구현을 하면서 사용될 CommentSerializer 및 LikeSerializer 생성 후 views.py에서 댓글 조회 및 댓글 등록 기능 구현을 목표로 정하였다.
views.py의 기본 뼈대는 다음과 같이 잡아두었고, 해당 구성은 설계한 API 문서를 참고하여 만들어주었다.

# comment/views.py
class CommentView(APIView):
# 댓글 조회 : /comment/<posttype_id>/<post_id>/
def get(self, request):
return Response({})
# 댓글 등록 : /comment/
def post(self, request):
return Response({})
# 댓글 수정 : /comment/<comment_id>
def put(self, request):
return Response({})
# 댓글 삭제 : /comment/<comment_id>
def delete(self, request):
return Response({})
class LikeView(APIView):
# 좋아요 등록 : /like/
def post(self, request):
return Response({})
# 좋아요 취소 : /like/
def delete(self, request):
return Response({})
이제 해당 기능을 위한 Serializer 및 veiw 설정을 해주었다.
# comment/serializers.py
from rest_framework import serializers
from comment.models import PostType, Comment, Like
class CommentSerializer(serializers.ModelSerializer):
username = serializers.SerializerMethodField()
posttype = serializers.SerializerMethodField()
def get_username(self, obj):
return obj.user.username
def get_posttype(self, obj):
return obj.posttype.typename
class Meta:
model = Comment
fields = ["id", "username", "posttype", "comment", "rating", "post_id"]
read_only_fields = ["user", ]
extra_kwargs = {
"post_id": {"write_only": True}
}
class LikeSerializer(serializers.ModelSerializer):
user = serializers.SerializerMethodField()
posttype = serializers.SerializerMethodField()
def get_user(self, obj):
return obj.user.username
def get_posttype(self, obj):
return obj.posttype.typename
class Meta:
model = Like
fields = ["user", "posttype", "post_id"]
# comment/views.py
from rest_framework.views import APIView
from rest_framework import status
from rest_framework.response import Response
from user.models import User
from comment.models import PostType, Comment, Like
from comment.serializers import CommentSerializer, LikeSerializer
class CommentView(APIView):
# 댓글 조회 : /comment/<posttype_id>/<post_id>/
def get(self, request, posttype_id, post_id):
comments = Comment.objects.filter(posttype=posttype_id, post_id=post_id)
comment_serializer = CommentSerializer(comments, many=True).data
return Response(comment_serializer, status=status.HTTP_200_OK)
# 댓글 등록 : /comment/
def post(self, request):
print(request.data)
request_user = request.data.pop("user", "")
request_posttype = request.data.pop("posttype", "")
user = User.objects.get(id=request_user)
posttype = PostType.objects.get(id=request_posttype)
comment_serializer = CommentSerializer(data=request.data)
if comment_serializer.is_valid():
comment_serializer.save(user=user, posttype=posttype)
return Response({"댓글 작성 성공"}, status=status.HTTP_200_OK)
return Response({"댓글 작성 실패"}, status=status.HTTP_400_BAD_REQUEST)
# 댓글 수정 : /comment/<comment_id>
def put(self, request):
return Response({})
# 댓글 삭제 : /comment/<comment_id>
def delete(self, request):
return Response({})
class LikeView(APIView):
# 좋아요 등록 : /like/
def post(self, request):
return Response({})
# 좋아요 취소 : /like/
def delete(self, request):
return Response({})
해당 기능 구현 이후 API 통신이 잘 이뤄지는지 코드 실행 후 Postman을 통해 확인을 해주었다.



DB에도 해당 데이터 값이 잘 들어가는 것을 볼 수 있었다.
-
원래 오늘 당장의 목표로는 댓글 수정, 댓글 삭제 기능도 구현해보려고 하였으나, API 통신을 진행할 때 잘 되지 않는 부분이 있었다.
오류가 일어난 부분을 해결하고자 다소 시간이 지체되어 목표치만큼 진행하지 못해 다소 아쉬웠다.
:T
'TIL 및 WIL > TIL (Today I Learned)' 카테고리의 다른 글
| [TIL] 2022.07.18 (MLT API 구현, My Little Trip(6)) (0) | 2022.07.18 |
|---|---|
| [TIL] 2022.07.15 (MLT API 구현, My Little Trip(5)) (0) | 2022.07.15 |
| [TIL] 2022.07.13 (MLT API 구현, My Little Trip(3)) (0) | 2022.07.13 |
| [TIL] 2022.07.12 (Docker, 도커(2)) (0) | 2022.07.12 |
| [TIL] 2022.07.11 (Docker, 도커(1)) (0) | 2022.07.11 |