(Django) 스타일쉐어 클론 - 팔로잉 카드 리스트(filter in list)

jomminii_before·2020년 3월 5일
0

스타일쉐에는 유사 SNS 기능을 하는 OOTD(Outfit Of The Day) 페이지가 있습니다. 여기에는 자신이 팔로잉하고 있는 사람들의 카드 리스트를 볼 수 있는 팔로잉 피드가 있는데요, 인스타의 핵심 피드와 비슷하다고 보시면 됩니다.

기존에 포스팅에 해당하는 카드의 데이터를 전달하는 로직은 작성했었는데, 팔로잉 리스트의 로직을 짜는건 좀 어려웠습니다. 로직이 어렵다기보다는 어떤 방법을 써서 이 로직을 실현시키는가가 문제였습니다.

팔로잉 리스트의 로직은 일단 내가 팔로잉 하는 사람들의 리스트를 뽑고, 이 사람들이 포스팅한 카드를 최신순으로 뽑아주도록 잡았습니다.

여기서 코드 작성부분에서 어려웠던 부분은 팔로잉하고 있는 followee들이 작성한 Style카드를 뽑아내는거였는데, for 문을 돌려서 뽑으면 쿼리문이 아니라 결과물 객체로 나와서 최신순으로 정렬하는 order_by를 쓸 수 없었습니다.

결국은 filter를 통해 followee 들의 리스트를 골라냈어야하는데 작성할 당시에는 방법을 몰라서 계속 머리를 써봤는데, 아무리 생각해봐도 리스트를 필터링할 방법이 있을 것 같았습니다. 그래서 찾고 찾아봤더니 filter.<필드명>in=list로 리스트를 필터링할 수 있었습니다.

이 방법을 쓰니 손쉽게 해결! 이 방법을 찾다가 다른 문법?들도 몇 개 찾아냈는데 생각해뒀다가 써먹어야겠습니다.


팔로잉 리스트 뷰 코드


class FollowingCardView(View):
    @login_decorator
    def get(self, request):
        followee_list = Follower.objects.filter(follower_id = request.user.id)
        followee_id_list = [followee.followee.id for followee in followee_list]
        style_list = Style.objects.filter(user_id__in=followee_id_list).prefetch_related('user','comments').order_by('-created_at')
        card_list = [
            {
                'style_id'           : style.id,
                'style_image_url'    : list(style.styleimage_set.values('image_url')),
                'style_description'  : style.description,
                'related_item'       : list(style.style_related_items.values()),
                'profile_image_url'  : style.user.image_url,
                'nickname'           : style.user.nickname,
                'profile_description': style.user.description,
                'date'               : str(style.created_at)[2:11],
                'like_count'         : style.style_like.count(),
                'comment_count'      : style.comments.count(),
                'comment'            : [
                    {
                        'profile_image' : comment.user.image_url,
                        'nickname'      : comment.user.nickname,
                        'description'   : comment.description,
                        'date'          : str(comment.updated_at)[2:11],
                        }
                    for comment in style.comments.all()],
            } for style in style_list]
        return JsonResponse({"card_list": card_list}, status = 200)
profile
https://velog.io/@jomminii 로 이동했습니다.

0개의 댓글