Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在django中有没有一种有效的方法来执行搜索查询?_Python_Django_Sqlite_Search - Fatal编程技术网

Python 在django中有没有一种有效的方法来执行搜索查询?

Python 在django中有没有一种有效的方法来执行搜索查询?,python,django,sqlite,search,Python,Django,Sqlite,Search,我正在创建一个博客,我想在其中根据评分(1-5)执行搜索查询。在这里,我的搜索像是查询:“智能手机技术更新”,评级:“3”。结果应该是包含查询词(至少一个词)的帖子列表,该查询词在val上以排序方式评级为3(对于每个查询词,如果在标题val+=1,如果在内容val+=0.4) My models.py文件包含以下内容: class Post(models.Model): title = models.CharField(max_length=50) content = model

我正在创建一个博客,我想在其中根据评分(1-5)执行搜索查询。在这里,我的搜索像是查询:“智能手机技术更新”,评级:“3”。结果应该是包含查询词(至少一个词)的帖子列表,该查询词在val上以排序方式评级为3(对于每个查询词,如果在标题val+=1,如果在内容val+=0.4)

My 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)
My 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)
我的URL.py是:

urlpatterns = [
    #...
    path('feed/search-result/', views.search, name='feed_search'),
]
我犯了这个错误
django.db.utils.OperationalError:没有这样的函数:plainto_tsquery

您可以在视图中这样尝试进行搜索

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>


为什么要在sqlite中使用Postgres函数?我在Django文档中找到了这个搜索查询。正如您所说,这是postgers db函数,我使用的是sqlite。有没有办法通过django models或sqlite queryAlmost获得我想要的,但是
rating
是一个整型字段,不支持
icontains
。只要
Q(title\u icontains=Q)| Q(rating=Q)
就行了。这不是我要问的。您的答案返回与查询完全匹配的结果。对于问题,如果我搜索“智能手机技术更新”,它将只返回具有相同顺序包含“智能手机技术更新”的帖子或标题的行。但不是有智能手机或技术或。。。而且它不会对数据进行排序,也不会返回要显式排序的附加值字段。您希望如何对数据进行排序?如果您希望得到准确的结果,则可以执行
title\uu iexact=q
我希望对具有最大匹配的结果进行排序。