8

我正在尝试构建一个搜索系统,并且我想通过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)

视图.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))

模板:

 {% 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 %}

我该怎么办?由于某些个人原因,我不想使用 haysatck。

4

4 回答 4

17

您可以使用 djangoQ对象进行OR查询,

或者,如果您想AND一起查询,只需将当前查找用作 kwargs

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

您应该真正考虑全文搜索或haystack(这使搜索变得容易),因为icontains问题 a%LIKE%不可远程扩展

于 2013-04-30T15:44:34.690 回答
10

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

显然在 django 1.10中添加了SearchVector类。

文档中的用法:

搜索单个字段非常棒,但也很有限。我们正在搜索的 Entry 实例属于一个 Blog,它有一个 tagline 字段。要查询这两个字段,请使用 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>]
于 2016-10-26T18:20:12.173 回答
6

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

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)
于 2017-11-15T03:49:35.483 回答
1

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

首先添加django.contrib.postgres,INSTALLED_APPS有助于利用 PostgreSQL 的全文搜索引擎。

在搜索的 views.py 中,

from django.contrib.postgres.search import SearchVector


# view function
def hup_find(request):
  search_vector = SearchVector('name', 'state', 'city')

  if ('q' in request.GET) and request.GET['q'].strip():
    query_string=request.GET['q']
    seens = Findhall.objects.annotate(
                search=search_vector).filter(search=query_string)

  return render(request, 'find.html', {'seens':seens})

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

找到了不同的方法,我认为Julien Phalip以更 Python 的方式使用搜索,

于 2020-09-15T06:54:27.303 回答