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