스타일쉐에는 유사 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)