게시글 검색 기능 만들기
게시글 검색 기능은 두가지 방법으로 만들 수 있다!
- Django REST Framework에서 제공하는 내장함수를 이용하는 방법
- 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)
백엔드에 쉽게 구현이 가능 했고, 나머지는 프론트에서 잘 구현하면 될꺼같다!
결과
'내일 배움 캠프 > TIL' 카테고리의 다른 글
공감 기능 구현과 one-to-one/many, many-to-one/many 관계 (0) | 2023.06.16 |
---|---|
Pagination (페이지네이션) 구현하기 (0) | 2023.06.16 |
대댓글 기능 만들기 (1) | 2023.06.15 |
조회수 기능 만들기(2)_IP기반 (0) | 2023.06.14 |
Import could not be resolved 오류 (0) | 2023.06.12 |