장고

개발 일지 15 - 게시글 좋아요 순으로 정렬 + 페이지 바뀔 때 정렬 유지

sorecord 2024. 8. 29. 11:54

 

어제 게시글을 조회순으로 정렬하던 post_sort함수를 더 보완했다.

 

 if sort_option == 'views_desc':
        print('-view')
        posts = Post_information.objects.all().annotate(like_count=Count('like_users')).order_by('-views')
    elif sort_option == 'views_asc':
        print("view")
        posts = Post_information.objects.all().annotate(like_count=Count('like_users')).order_by('views')
    elif sort_option == 'likes_desc':
        print("-likes")
        # 좋아요 수를 기반으로 내림차순 정렬
        posts = Post_information.objects.annotate(like_count=Count('like_users')).order_by('-like_count')
    elif sort_option == 'likes_asc':
        print("likes")
        # 좋아요 수를 기반으로 오름차순 정렬
        posts = Post_information.objects.annotate(like_count=Count('like_users')).order_by('like_count')
    else:
        posts = Post_information.objects.all().order_by('-created_at')

 

위에서 보면 annotate라는 메서드를 사용했다.

 

annotate 사용

 

  • 집계 데이터 추가: 객체 집합 내에서 특정 필드에 대한 집계 데이터를 생성하고, 그 결과를 각 객체에 추가
  • 조건부 필드 생성: 조건에 따라 필드를 생성하거나 수정
  • 정렬 또는 필터링: 계산된 필드를 기반으로 쿼리셋을 정렬하거나 필터링

여기서 난 집계데이터를 추가하기 위해서 사용했다. 

Post_information이라는 DB에 좋아요를 카운트하는 필드가 존재하지 않아서 like_count라는 객체를 만들어주고 Count를 이용해서 like_user ( 좋아요를 누른 사람의 수) 카운팅 후에 like_count에 넣어주었다. 

 

아래와 같이 사용을 할 수가 있다. 

 

 <div class="post-meta">{{ post.created_at|date:"Y-m-d H:i" }} / {{ post.author.nickname }} / 조회수:{{ post.views }}/좋아요:{{ post.like_count }}</div>

 

 

 

 

게시글의 개수가 많아지고 페이지가 나뉘게 될 때 경로가 달라서 정렬이 제대로 안되는 문제가 있다는 것을 발견했다. 

 

예시>

1페이지에서 조회수 높은 순 정렬을 하면 book/book/?sort=views_desc  경로가 나온다.

 

2페이지로 넘어가면 /book/book/?page=2  경로이다. 

 

위와 같은 문제 때문에 페이지 넘어가면 정렬이 유지되지 않고 풀리는 문제가 발생

 

해결책 => 페이지네이션을 사용하면서 정렬을 유지하려면 'sort' 파라미터가 유지되도록 URL을 만들어야 한다.

 

{% if request.GET.sort %}&sort={{ request.GET.sort }}{% endif %}

 

위에 조건문을 URL에 포함을 해서 정렬을 해야 하면 sort 파라미터를 맏아오고 그렇지 않을 경우에는 평상시처럼 실행이 되게끔 만들었다.

 

<a href="?page={{ page_obj.next_page_number }}{% if request.GET.sort %}&sort={{ request.GET.sort }}{% endif %}">다음</a>

 

위와 같이 추가를 해주었다.