搜索Django中的多个字段

pic*_*mon 5 python django django-views

我正在尝试建立一个搜索系统,我想name, state, city,在我的django模型中搜索多个字段.我写了下面的代码,但我一直无法弄清楚如何去做.

楷模:

class Finhall(models.Model):
     user=models.ForeignKey(User)
     name=models.CharField(max_length=250, unique=True)
     address=models.CharField(max_length=200)
     city=models.CharField(max_length=200)
     state=models.CharField(max_length=200)

     def __unicode__(self):
         return u'%s' % (self.name)
Run Code Online (Sandbox Code Playgroud)

Views.py

def hup_find(request):
    if ('q' in request.GET) and request.GET['q'].strip():
        query_string=request.GET.get('q')
        seens=Finhall.objects.filter(name__icontains=query_string)
    else:
        seens=None
    return render_to_response('find.html',{'seens':seens},context_instance=RequestContext(request))
Run Code Online (Sandbox Code Playgroud)

模板:

 {% block content %}
     <body>
    <form action="" method="GET">
    <input type="text" name="q" />
    <button type="submit">search</button>
   </form>


    {% for seen in seens %}

    <p> {{seen.name}}</p>

    {% empty %}

      <p> no search </p>
    {% endfor %}

 </body>

   {% endblock %}
Run Code Online (Sandbox Code Playgroud)

我怎么能这样做?由于某些个人原因,我不想使用haysatck.

dm0*_*514 9

你可以用django Q对象来做OR查询,

或者如果你想要AND一起查询,只需使用当前的查找作为kwargs

seens=Finhall.objects.filter(name__icontains=query_string, address__icontains=query_string)

您应该考虑全文搜索或haystack(这使搜索变得简单),因为icontains问题%LIKE%不是可远程扩展的


Rob*_*eth 9

编辑:刚刚注意到它只是 Postgres

显然在 django 1.10 SearchVector类中添加。

文档中的用法:

针对单个字段进行搜索很好,但也很有限。我们正在搜索的 Entry 实例属于一个博客,它有一个标语字段。要查询这两个字段,请使用 SearchVector:

>>> from django.contrib.postgres.search import SearchVector
>>> Entry.objects.annotate(
...     search=SearchVector('body_text', 'blog__tagline'),
... ).filter(search='Cheese')
[<Entry: Cheese on Toast recipes>, <Entry: Pizza Recipes>]
Run Code Online (Sandbox Code Playgroud)


Raj*_*rma 5

要在多个字段中搜索相同的文本,您可以使用:

from django.db.models import Q

class SearchAPI(APIView):
    def get(self, request, search_text, format=None, **kwargs):
        Model.objects.filter(Q(search_tags__contains=search_text) | Q(auto_tags__contains=search_text)
Run Code Online (Sandbox Code Playgroud)


Aks*_*ran 5

正如Robin Nemeth所建议的,如果您使用的是 postgres db,则可以使用 SearchVector,(我只是直接回答问题,请在django 文档中获取完整的详细信息。)

\n

首先添加django.contrib.postgresINSTALLED_APPS,有助于利用 PostgreSQL\xe2\x80\x99s 全文搜索引擎。

\n

在搜索的views.py中,

\n
from django.contrib.postgres.search import SearchVector\n\n\n# view function\ndef hup_find(request):\n  search_vector = SearchVector(\'name\', \'state\', \'city\')\n\n  if (\'q\' in request.GET) and request.GET[\'q\'].strip():\n    query_string=request.GET[\'q\']\n    seens = Findhall.objects.annotate(\n                search=search_vector).filter(search=query_string)\n\n  return render(request, \'find.html\', {\'seens\':seens})\n
Run Code Online (Sandbox Code Playgroud)\n

对于大型数据库,搜索过程需要一些时间,您可以使用 postgresql 的 GIN-(通用倒排索引)功能来提高性能,这些是官方文档之外的一些有用的链接

\n\n

发现了不同的方法,我认为Julien Phalip以一种更 Pythonish 的方式使用搜索,

\n