코딩공부/Django

DRF Feedview 헤쳐보기 / TIL_221027

Dong_Devlog 2022. 10. 27. 20:44

인스타나 유튜브 또는 여러 SNS에서 사용하는 피드 기능 즉, 팔로우 유저 컨텐츠를 보여주는 기능을 공부해보았다.

 

  • DRF의 클래스 기반의 뷰를 사용 하여 피드 기능을 구현하였고,
# views.py

class FeedView(APIView):
    permission_classes = [permissions.IsAuthenticated]

    def get(self, request):
        q = Q()
        for user in request.user.followings.all():
            q.add(Q(user=user),q.OR)
        feeds = Article.objects.filter(q)
        serializer = ArticleListSerializer(feeds, many=True)
        return Response(serializer.data)

 

  • permission_classes = [permissions.IsAuthenticated]

APIView에서는 permission_classes를 통해 권한을 지정할 수 있는데, permissions.IsAuthenticated는 인증된 요청에 한해서만 뷰호출을 허용한다는 의미로 로그인을 하지 않은 유저는 권한이 없으므로 403 에러가 뜨며, 권한이 없다는 메세지를 출력한다.

 

  • q = Q()

Djnago ORM으로 and와 or을 활용할 수 있다. 반복문을 사용해 followings한 유저만 user에 담에 q.add를 통해 q에 넣어준다. 

 

Q를 사용해 쿼리에 and와 or을 적용시킬 수 있다. 아래와 문법으로 사용하면 된다.

q.add(Q(Field명=찾는 값),q.AND) : 두번째 인자인 q.AND는 앞의 값과 AND로 연결하는 역할을 한다.

q.add(Q(Field명=찾는 값),q.OR) : 두번째 인자인 q.OR는 앞의 값과 OR로 연결하는 역할을 한다.

 

  • feeds = Article.objects.filter(q)

filter(q)는 Article에서 q(followings 한 유저) 값만 feeds에 담고,

 

  • serializer = ArticleListSerializer(feeds, many=True)

serializer에 저장하여 Json 형태로 변환하여 데이터를 반환해주면 된다.