<aside> 💡 게시판 필터 만들기

</aside>

기본 게시판

@api_view(['GET', 'POST'])
def article_list_or_create(request):
    # 게시글 전체 조회
    def article_list():
        # 좋아요 유저 수 column추가
        articles = Article.objects.annotate(
            like_count=Count('like_users', distinct=True)
        ).order_by('-pk')
        serializers = ArticleListSerializer(articles, many=True)
        return Response(serializers.data)
    
    # 게시글 생성
    def article_create():
        serializers = ArticleSerializer(data=request.data)
        if serializers.is_valid(raise_exception=True):
            serializers.save(user_id=request.user)
            return Response(serializers.data, status=status.HTTP_201_CREATED)

    if request.method == 'GET':
        return article_list()
    elif request.method == 'POST':
        return article_create()

1. 1주일이내 좋아요가 많은 순으로 만들기

(1) created_at을 1주일 이전부터인 데이터 받아오기

  1. 1주일 전 날짜 구하기
now = datetime.now()
    before_one_week = now - timedelta(weeks=1)
    now = now.strftime('%Y-%m-%d')
    since = before_one_week.strftime('%Y-%m-%d')
  1. 게시판 필터링하기
articles = Article.objects.filter(created_at__range=[since, now])
  1. timezone.now()사용하기!
now = timezone.now()
articles = Article.objects.filter(created_at__range=[now-timedelta(days=6), now])

(2) 인기도순으로 나열

# 최근 1주일 게시글, 좋아요 순으로 나열
    articles = Article.objects.filter(
        created_at__range=[now-timedelta(days=6), now]
    ).annotate(
        like_count=Count('like_users', distinct=True)
    ).order_by('-like_count')