Python 在Django中搜索多个字段

Python 在Django中搜索多个字段,python,django,django-views,Python,Django,Django Views,我正在尝试建立一个搜索系统,我想在我的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.Char

我正在尝试建立一个搜索系统,我想在我的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)
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 %}
{%block content%}
搜索
{在seens%中看到的百分比}
{{seen.name}

{%empty%} 禁止搜索

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

您可以使用django对象执行
查询

或者,如果您想同时使用
查询,只需将当前查找用作KWARG即可

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

您应该真正考虑全文搜索或<代码> HasDACK (这使得搜索变得容易),因为<代码> ICONDENCE < /代码>发布了<%> %> %这不是可远程可扩展的

< P>编辑:只是注意到它只是P< 显然,在django中添加了1.10类

文档中的用法:

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

>>来自django.contrib.postgres.search导入SearchVector
>>>Entry.objects.annotate(
…search=SearchVector('body\u text','blog\u tagline'),
…).filter(search='Cheese')
[, ]

要在多个字段中搜索同一文本,可以使用以下方法:

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)
正如所建议的,如果您使用的是postgres db,那么可以使用SearchVector(我只是直截了当地回答这个问题,请在中获取完整的详细信息)

首先将
django.contrib.postgres
添加到
已安装的应用程序中,有助于利用PostgreSQL的全文搜索引擎

在搜索的views.py中

来自django.contrib.postgres.search导入SearchVector
#视图功能
def hup_查找(请求):
search\u vector=SearchVector('name','state','city'))
if('q'在request.GET中)和request.GET['q'].strip():
query\u string=request.GET['q']
seens=Findhall.objects.annotate(
搜索=搜索向量).filter(搜索=查询字符串)
返回呈现(请求'find.html',{'seens':seens})
对于大型数据库,搜索过程需要一些时间,您可以使用postgresql的GIN(广义反向索引)功能来提高性能,这些是官方以外的一些有用链接

  • 这个
我们发现了不同的方法,我认为用一种更为通俗的方式使用搜索

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)