def search(request): """Search query. Use /api/search/?q=query""" # Question.objects.filter(content__search='Javascript') search_query = request.GET.get('q') if not search_query: return HttpResponse(status=404, content=b"Empty query string. Use /api/search/?q=query for search") if search_query.startswith('tag:'): # тег идет после tag: строго без пробела как в гуглопоиске tagword = search_query[4:] searchv = SearchVector('tags') searchv.default_alias = 'tag_search' found = Question.objects.filter(tags__tagword__iexact=tagword).order_by('-rating', '-created') else: searchv = SearchVector('title', 'content') searchv.default_alias = 'question_search' found = Question.objects.annotate(search=searchv).filter(search=search_query)\ .order_by('-rating', '-created') paginator = PageNumberPagination() result_page = paginator.paginate_queryset(found, request) serializer = QuestionSerializer(result_page, many=True) return paginator.get_paginated_response(serializer.data)
def tag_search(request, tagword): searchv = SearchVector('tags') searchv.default_alias = 'tag_search' found = Question.objects.filter(tags__tagword__iexact=tagword).order_by( '-rating', '-created') paginator = Paginator(found, 20) page = request.GET.get('page') questions = paginator.get_page(page) return render( request, 'questions/tag.html', { 'questions': questions, 'title': f'Tag: #{tagword}', 'tagword': tagword, 'count': paginator.count, 'trending': _get_trending(), })
def search(request): # Question.objects.filter(content__search='Javascript') search_query = request.GET.get('q') if search_query.startswith('tag:'): # тег идет после tag: строго без пробела как в гуглопоиске return tag_search(request, search_query[4:]) searchv = SearchVector('title', 'content') searchv.default_alias = 'question_search' found = Question.objects.annotate(search=searchv).filter(search=search_query)\ .order_by('-rating', '-created') paginator = Paginator(found, 20) page = request.GET.get('page') questions = paginator.get_page(page) return render( request, 'questions/search.html', { 'questions': questions, 'title': f'Search: "{search_query}"', 'search_query': search_query, 'count': paginator.count, 'trending': _get_trending(), })