2013-04-30 92 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) 
相關問題