Поиск нескольких - PullRequest
       2

Поиск нескольких

0 голосов
/ 12 декабря 2010

Моя поисковая функция получает поисковый запрос любым из следующих способов:

  • имя "Томас"
  • фамилия "кузнец"
  • имя, фамилия, фамилия "Томас Смит"

Я пытаюсь создать набор запросов, который найдет клиент "Томас" по любому из этих терминов, но сузит результаты до "Томас Смит" вместо "Томас Джонс" или "Джордж Смит", если оба имени поставляются.

Я провел много исследований о том, как использовать фильтры, объекты Q, разбиение строк и циклы для достижения этой цели, но пока что не повезло.

MODEL:
class Client(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

VIEW:
def search(request):
    query = request.GET.get('s', '').strip()
    if query:
        client_set = (
            (Q(first_name__in=query) & Q(last_name__in=query)) |
            Q(first_name__icontains=query) |
            Q(last_name__icontains=query)  
        )
    else:
        client_list = []
    return render_to_response("search.html", {
        "client_list": client_list,
        "query": query
    },context_instance=RequestContext(request))

Приведенный выше код работает при поиске "thom", но ничего не находит для "thomas smith". Как я могу переписать это, чтобы функционировать, как описано?

1 Ответ

1 голос
/ 12 декабря 2010

Я считаю, что это должно делать то, что вы хотите:

def search(request):
    name = request.GET.get('s', '').strip().split(' ', 1)
    client_set = Client.objects.all()

    if len(name) == 2:
        first_name, last_name = name
        client_set = client_set.filter(
            first_name__icontains=first_name,
            last_name__icontains=last_name,
        )
    else:
        name = name[0]
        client_set = client_set.filter(
            client_set.filter(first_name__icontains=name)
            | client_set.filter(last_name__icontains=name)
        )

    return render_to_response("search.html", {
        "client_list": client_list,
        "query": query
    }, context_instance=RequestContext(request))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...