본문 바로가기

TIL 및 WIL/TIL (Today I Learned)

[TIL] 2022.07.14 (MLT API 구현, My Little Trip(4))

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

 

마무리 진행 상황

 

현재 구현한 기능으로는 API 구현을 하면서 사용될 CommentSerializer 및 LikeSerializer 생성 후 views.py에서 댓글 조회 및 댓글 등록 기능 구현을 목표로 정하였다.

 

views.py의 기본 뼈대는 다음과 같이 잡아두었고, 해당 구성은 설계한 API 문서를 참고하여 만들어주었다.

 

댓글/좋아요 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을 통해 확인을 해주었다.

 

댓글 조회 (GET)
댓글 등록 (POST)
댓글 등록 DB

 

DB에도 해당 데이터 값이 잘 들어가는 것을 볼 수 있었다.

 

-

 

원래 오늘 당장의 목표로는 댓글 수정, 댓글 삭제 기능도 구현해보려고 하였으나, API 통신을 진행할 때 잘 되지 않는 부분이 있었다.

오류가 일어난 부분을 해결하고자 다소 시간이 지체되어 목표치만큼 진행하지 못해 다소 아쉬웠다.

 

:T