본문 바로가기

내일 배움 캠프/TIL

게시글 검색 기능 구현

 

게시글 검색 기능 만들기

게시글 검색 기능은 두가지 방법으로 만들 수 있다!

  1. Django REST Framework에서 제공하는 내장함수를 이용하는 방법
  2. filter() - Q 를 이용하는 방법

 

 

나는 APIView를 이용할꺼라서 2번째 방법을 선택 했다.

먼저 Q를 사용하기 위해 import를 해주고, 주소창에 어떤식으로 받아올지 정해야한다.

# blogs/views.py

from django.db.models import Q

....

class SearchView(APIView):
    
    def get(self, request, blog_name):
        """게시글 검색 기능"""
        
        search_word = request.GET.get('search-word','') # 주소창에 ?search-word='' 형식으로 받아온다.
        blog = Blog.objects.filter(blog_name=blog_name)
        articles = Article.objects.filter(blog_id=blog[0].id).order_by("-created_at")

 

 

 

다음으로 생각해 주어야 할 것은, 검색을 할 때 어떤것을 비교해서 내보낼것인지 생각해보아야 한다. 그래서 filter()에 조건을 연결줄것이다.

if search_word:
            articles = articles.filter(
                Q(title__icontains=search_word) |
                Q(content__icontains=search_word)
            ).distinct()

 

여기서 '__incontains'는 대소문자를 가리지 않고 찾아주는 역할이고, 끝에 distinict() 를 써준이유는 조회 결과에 중복이 있을 경우를 대비해서 중복을 제거해주기 위해 사용했다.

 

 

전체 코드

class SearchView(APIView):
    
    def get(self, request, blog_name):
        """게시글 검색 기능"""
        blog = Blog.objects.filter(blog_name=blog_name)
        articles = Article.objects.filter(blog_id=blog[0].id).order_by("-created_at")
        search_word = request.GET.get('search-word','') # 주소창에 ?search-word='' 형식으로 받아온다.
        
        if search_word:
            articles = articles.filter(
                Q(title__icontains=search_word) |
                Q(content__icontains=search_word)
            ).distinct()
            
        serializer = SearchSerializer(articles, many=True)
        return Response(serializer.data, status=status.HTTP_200_OK)

 

백엔드에 쉽게 구현이 가능 했고, 나머지는 프론트에서 잘 구현하면 될꺼같다!

 

 

 

결과

 

전체 게시글 리스트 조회 ( 검색 전 )

 

 

'제목' 으로 검색시 나온 결과물