2013-04-30 96 views
3

我试图构建一个搜索系统,并且我想在我的django模型中通过多个字段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) 

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

你可以使用Django Q对象做OR查询,

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

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

你真的应该考虑全文搜索或haystack(使搜索容易),因为icontains发出%LIKE%这是不可远程扩展的

3

编辑:只注意到它是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>] 
0

要搜索在多个领域相同的文本,你可以使用这个:

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) 
相关问题