搜索Django中的多个字段

时间:2013-04-30 15:38:05

标签: python django django-views

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

型号:

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)

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))

模板:

 {% 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 个答案:

答案 0 :(得分:6)

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

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

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

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

答案 1 :(得分:4)

编辑:刚刚发现它只是Postgres

显然在django 1.10 SearchVector课程中已添加。

来自文档的用法:

  

针对单个字段进行搜索非常有用,但相当有限。我们正在搜索的Entry实例属于Blog,它有一个标语字段。要查询这两个字段,请使用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>]

答案 2 :(得分:1)

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

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)

答案 3 :(得分:0)

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

首先将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-(广义倒排索引)功能来提高性能,这些是除官方documentation之外的有用链接,

找到了不同的方法,我认为Julien Phalip以一种更加蟒蛇般的方式进行搜索,

相关问题