본문 바로가기
코딩공부/Django

DRF APIView로 좋아요 기능 구현_백엔드

by Dong_Devlog 2022. 12. 2.

아직 코딩 초보이기에 미개한 방법일 수 있으나 열심히 짱구를 굴려 구현한 좋아요 기능에 알아보겠습니다.

 

APIView로 get, post 메소드를 통해 프론트엔드와 통신을 해야 한다. get 메소드는 좋아요에 대한 정보를 프론트가 받아 사용할 것이고, post 메소드는 프론트에서 좋아요 버튼을 눌렀을 때 백에서 이를 받아 DB에 저장해주게 된다.

 

좋아요 필드는 ManyToManyField로 작성해주었다. PositiveIntegerField를 사용하는 방법도 있는 것 같은데 아직 완전히 이해하지 못해서 다음 기회에 공부해보기로..

# models.py
class Post(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE) 
    ...
    likes = models.ManyToManyField(User, related_name='like_posts')

 

get 메소드에서 필요한 정보들을 serializer에 필드값으로 넣어주었다.

user는 포스트  작성 user, likes_count는 좋아요 숫자 카운트, likes는 좋아요 누른 user

# serializers.py
class PostLikeSerializer(serializers.ModelSerializer):
    user = serializers.SerializerMethodField()
    likes = serializers.StringRelatedField(many=True)
    likes_count = serializers.SerializerMethodField()

    def get_user(self, obj):
        return obj.user.username

    def get_like_count(self, obj):
        return obj.likes.count()

    class Meta:
        model = Post
        fields = ("id", "user", "likes_count", 'likes')

 

API 통신을 위해 views.py를 작성

get 메소드에서 시리얼라이즈에 담은 필드 정보를 넘겨줄 수 있도록 리턴 리스폰스에 담아 넘겨주고,

post 메소드에서는 프론트에 요청을 보내면 DB에 해당 user가 누른 정보가 있다면 제거해주고, 아니면 추가해주는 방식으로 코드를 짜주었습니다.

# views.py
class LikeView(APIView):
    def get(self, request, post_id):
        post = get_object_or_404(Post, id=post_id)
        serializer = PostLikeSerializer(post)
        return Response(serializer.data, status=status.HTTP_200_OK)
    
    def post(self, request, post_id):
        post = get_object_or_404(Post, id=post_id)
        if request.user in post.likes.all():
            post.likes.remove(request.user)
            return Response("unlike", status=status.HTTP_200_OK)
        else:
            post.likes.add(request.user)
            return Response("like", status=status.HTTP_200_OK)

 

프론트와 API 통신을 하기 위한 프론트엔드 코드는 다음에...

댓글