블로그 서비스에서 유저의 활동을 보여주고 싶었다. 가령 댓글, 좋아요, 시리즈 생성, 포스트 작성을 한 눈에 확인할 수 있도록 말이다. 이전에는 댓글을 우선 나열한 후 좋아요를 나열했는데 시간순서에 맞게 모든 항목을 조합하여 보여주고 싶었다. +도 안되고 어떻게 합칠까 어떻게 정렬시켜야 할까 정말 삽질도 많이하고 검색도 많이 했는데 엄청난 함수가 있었다.

1
2
3
4
5
6
7
from itertools import chain

posts = Post.objects.filter(author=user, hide=False)
series = Series.objects.filter(owner=user)
likeposts = PostLikes.objects.filter(user=user)
comments = Comment.objects.filter(author=user, post__hide=False)
activity = sorted(chain(posts, series, comments, likeposts), key=lambda instance: instance.created_date, reverse=True)

chain이라는 함수를 사용하여 간단하게 조합이 가능하고 sorted 함수를 통해서 정렬이 가능하다. 다만 람다를 사용할때 정렬할 키의 이름이 다르면 어떻게 해야할지 몰라서 모델의 속성의 이름을 하나로 통일했다. 또한 템플릿에선 각 모델이 어떤 모델인지 파악할 필요가 있었는데 필자의 경우에는 각 모델의 고유한 속성의 유무로 판단했다.

1
2
3
4
5
6
7
8
9
10
11
{% for active in elements %}
    {% if active.text_md %}
        {{ is_comments }}
    {% elif active.text %}
        {{ is_posts }}
    {% elif active.owner %}
        {{ is_series }}
    {% else %}
        {{ is_likeposts }}
    {% endif %}
{% endfor %}

결과물

WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com