2013-04-30 2 views
3

Я пытаюсь создать поисковую систему, и я хочу искать по нескольким полям name, state, city, в моих моделях django. Я написал код ниже, но я не мог понять, как это сделать.Поиск по нескольким полям в 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 ваши запросы вместе просто использовать текущие Lookups в kwargs

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

Вы должны действительно рассмотреть полный текст поиск или haystack (что делает поиск простым), потому что icontains выдает %LIKE%, который не удаленно масштабируется

3

EDIT: Только что заметил только Postgres

По-видимому, в джанго 1.10 SearchVector класс был добавлен.

Использование из документации:

Поиск против одного поля является большим, но довольно ограничительными. Входящие экземпляры, которые мы ищем, принадлежат блогу, у которого есть поле 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>] 
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) 
Смежные вопросы