2010-07-03 5 views
2

У меня есть функция имени по имени, которая должна возвращать имя одного человека, если поиск совпадает с именем или фамилией. Проблема в том, что если я ищу строки, такие как «firstname lastname», он не находит имя, которое соответствует (угадайте, из-за пробела между словами). Что я должен делать для поиска? Кроме того, если я хочу выполнить поиск с тем же поиском, имя пользователя (которое находится в другой таблице), как я могу это сделать? Спасибо большое!Django поиск строк, содержащих пробелы

мой код:

def search(request): 
    query = request.GET.get('q', '') 
    if query: 
     qset1 = (
      Q(first_name__icontains=query) | 
      Q(last_name__icontains=query) 
       ) 
     results = UserProfile.objects.filter(qset1).distinct() 
    else: 
     results = [] 

    return render_to_response("search/searchName.html", { 

    'results': results,  
    'query': query}, 
    context_instance=RequestContext(request)) 

ответ

8

Сейчас ваш синтаксический не расщепляется запроса вверх на всех, вы могли бы сделать это, цикл по результатам, и построить себе объект Q, чтобы поместить в ваш запрос.

import operator 
queries = request.GET.get('q').split() 
qset1 = reduce(operator.__or__, [Q(first_name__icontains=query) | Q(last_name__icontains=query) for query in queries]) 

results = UserProfile.objects.filter(qset1).distinct() 

Что это в основном будет делать, это разделить запрос и прокрутить каждое слово, выполняя именно то, что вы уже делаете. Поэтому, если они будут искать «Фрэнк Подольски», он будет проверять, что «Фрэнк» находится в первом имени, фамилии, а затем, если «Подольски» также находится в имени, фамилии, а не в запросе в целом.

Конечно, вы можете сделать гораздо больше, чтобы улучшить поиск, например, удаление, удаление стоп-слов и т. Д., Но это не в контексте этого вопроса.

+0

это работает, спасибо! :) – dana

+0

Работает для меня тоже, хорошая работа! – Spike

Смежные вопросы