검색 기능 - 검색 기능
Search의 모델
class Search(models.Model):
# 검색할 때, 받는 필드
title = models.CharField(max_length=10)
# 인기 검색어를 위해 필요한 필드
count = models.PositiveIntegerField(default=0)
views.py의 검색 기능
def search(request):
popular_list = {}
if request.method == "GET":
search = request.GET.get("searched", "")
sort = request.GET.get("sorted", "")
if not search.isdigit() and not search == "":
if Review.objects.filter(
Q(title__icontains=search)
| Q(content__icontains=search)
| Q(place__icontains=search)
):
popular_list[search] = popular_list.get(search, 0) + 1
for k, v in sorted(popular_list.items(), key=lambda x: -x[1]):
if Search.objects.filter(title=k):
s = Search.objects.get(title=k)
s.count += 1
s.save()
else:
s = Search(title=k, count=v)
s.save()
popular = Search.objects.order_by("-count")[:10]
search_list = Review.objects.filter(
Q(title__icontains=search)
| Q(content__icontains=search)
| Q(place__icontains=search)
| Q(theme__icontains=search)
| Q(user_id__profile_name__icontains=search)
)
if search:
if search_list:
pass
if sort == "pop":
search_list = search_list.order_by("-like_users")
sort="pop"
print(search_list)
if sort == "recent":
search_list = search_list.order_by("-updated_at")
sort="recent"
print(search_list)
page = int(request.GET.get("p", 1))
pagenator = Paginator(search_list, 5)
boards = pagenator.get_page(page)
return render(
request,
"articles/search.html",
{
"search": search,
# 페이별로 저장된 queryset을 가지고 온다
"boards": boards,
# 검색어에 대한, 검색된 queryset들의 리스트를 가지고 온다
"search_list": search_list,
# 검색이 많이 된 순으로 queryset을 정리해서 가지고 온다
"popular": popular,
# 특정 필드로 인해 정렬된 queryset들을 가지고 온다
"sort" : sort,
},
)
else:
k = "검색 결과가 없습니다 다시 검색해주세요"
context = {"v": k}
return render(request, "articles/searchfail.html", context)
✍️ from django.db.models import Q
- 주로 .filter ORM을 사용할 때, 어떠한 정보를 찾을 때 사용한다
- 주로 | & ^ 를 사용한다 (순서대로, and, or, xor)
- 예시)
ORM : Q(question__startswith='Who') | Q(question__startswith='What')
SQL : WHERE question LIKE 'Who%' OR question LIKE 'What%'
코드 뜯어내기
검색 기능
views.py 검색 기능
def search(request):
if request.method == "GET":
search = request.GET.get("searched", "")
search_list = Review.objects.filter(
Q(title__icontains=search)
| Q(content__icontains=search)
| Q(place__icontains=search)
| Q(theme__icontains=search)
| Q(user_id__profile_name__icontains=search)
)
if search:
if search_list:
pass
return render(
request,
"articles/search.html",
{
"search": search,
"boards": boards,
"search_list": search_list,
"popular": popular,
"sort" : sort,
},
)
else:
k = "검색 결과가 없습니다 다시 검색해주세요"
context = {"v": k}
return render(request, "articles/searchfail.html", context)
search = request.GET.get("searched", "")
- `search` 변수는, client가 searched url을 요청 했을 때, 검색한 값을 저장한다
- 여기서 `("searched", "")`에서 ""는, 안에 값을 넣는 것
- url 예시) /?searched=검색한 단어
- 즉 " " 안에, 검색한 단어가 들어가게 된다
from django.db.models.import Q
search_list = Review.objects.filter(
Q(title__icontains=search)
| Q(content__icontains=search)
| Q(place__icontains=search)
| Q(theme__icontains=search)
| Q(user_id__profile_name__icontains=search)
)
- search 변수에 값이 저장되었으면, DB에서 해당 값을 포함한 queryset을 가지고 온다
- search_list = Review.objects.filter, Review라는 DB에서 quaryset들을 가지고 와서 search_list에 저장한다
- get은 하나의 queryset만 찾을 수 있으며, filter는 그 이상으로 찾을 수 있다
- Q(title__icontains=search)
- Review의 title이라는 필드 안에, search 변수의 값을 포함(icontains)하면 search_list에 저장하기
- 여기서 Q는 위에 설명이 있음 (import을 해야 한다)
'프로젝트 > 여행석사' 카테고리의 다른 글
여행석사 - 댓글 비동기 기능 (0) | 2023.02.22 |
---|---|
여행 석사 - 검색 결과 정렬 기능 (0) | 2023.02.22 |
여행 석사 - 인기 검색어 기능 (0) | 2023.02.22 |
여행석사 - Pagination 기능 (0) | 2023.02.22 |
여행 석사 - 소개 (0) | 2023.02.22 |