Есть ли эффективный способ выполнить поисковый запрос в Django? - PullRequest
0 голосов
/ 05 июля 2019

Я создаю блог, в котором я хочу выполнить поисковый запрос на основе рейтинга (1-5).Здесь мой поиск будет похож на запрос: «обновления технологий смартфонов», рейтинг: «3».Результатом должен быть список сообщений, содержащих слово запроса (хотя бы одно слово) с рейтингом 3, отсортированным по значению val (для каждого слова запроса, если оно найдено в заголовке val + = 1, если найдено в содержимом val + = 0.4).

Мой файл models.py содержит следующее:

class Post(models.Model):
    title = models.CharField(max_length=50)
    content = models.CharField(max_length=500)
    rating = models.IntegerField(default=1)
    enter code here
    date = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

Мой файл view.py содержит следующее:

def search(request):
    contents = Post.objects.all()

    if request.method == 'GET':
        query = request.GET['query']
        rating = request.GET['rating']

        # search function

        # contents = InSearch.search_fun(contents,query,rating)
        vector = SearchVector('title', weight='A') + SearchVector('content', weight='B')
        qry = SearchQuery(str(query))
        contents = Post.objects.annotate(rank=SearchRank(vector, qry)).order_by('-rank')

        #print("---->\n\t"+query+ str(contents))

        context = {
            'contents': contents
        }
    else:
        context = {
            'contents': Post.objects.all()
        }

    return render(request, 'feed/home.html', context)

Мои urls.py:

urlpatterns = [
    #...
    path('feed/search-result/', views.search, name='feed_search'),
]

Я получаю эту ошибку django.db.utils.OperationalError: no such function: plainto_tsquery

1 Ответ

1 голос
/ 05 июля 2019

Вы можете попробовать это в своих представлениях для поиска.

from django.db.models import Q
def search(request):
 q = request.GET.get('q')
    if q:
       search_results = Post.objects.filter(Q(title__icontains=q)|Q(rating=q))
   # if you want the exact then do Post.objects.filter(Q(title__iexact=q) & Q(rating=q))

       return render(request, 'feed/home.html','search_results':search_results)
    else:
        messages.info(request,'no results found for {}',format(q))

Если вы хотите отсортировать результаты поискового запроса по количеству совпадений, вы можете попробовать это так:

search_results = Post.objects.filter(Q(title__icontains=q)|Q(rating=q)).annotate(title_counts=Count('title')).order_by('-title_counts')

А в вашем шаблоне укажите name='q' в форме поиска.

 <form  action="{% url 'your search action' %}">
     <input type="text" name="q">
     <input type='submit' value='Search'>
   </form>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...