2010-12-08 1 views
2

У меня есть модель Django под названием Author, с полем под названием name, который не раскололся на LastName/ПгвЬЫате:Django: поиск по первым буквам отдельных слов в фразе?

class Author(models.Model): 
    name = models.CharField(max_length=200, unique=True) 

К примеру, у меня есть запись Автор с именем «Дональда Кнута» ,

Теперь я хотел бы запросить по имени, используя istartswith в начале каждого слова в поле name.

Так что я хотел бы иметь возможность запросить 'Kn' и получить 'Donald Knuth' назад.

Что-то вроде:

authors = Author.objects.filter(name__word__istartswith="Kn") 

Возможно ли это в Django?

ответ

1

Вы можете использовать iregex поиск:

import re 

text = "Kn" 
text = re.escape(text) # make sure there are not regex specials 
authors = Author.objects.filter(name__iregex=r"(^|\s)%s" % text) 

Это не очень эффективно, но должно работать. В MySQL вы можете попробовать воспользоваться full-text search features. В других БД вам понадобятся дополнительные инструменты для эффективного полнотекстового поиска (например, django-haystack).

+0

Спасибо! Это именно то, что мне нужно, за исключением того, что «(^ | \ s)% s» совпадает только в начале имени. Любая идея, как я могу заставить ее соответствовать началу любого слова в имени? Я предполагаю, что «\ b» должно быть задействовано где-то ... – AP257 2010-12-08 18:46:02

0

Для MySQL [[: <:]] соответствует началу слова.

searchStr = "Kn" 
authors = Author.objects.filter(name__iregex=r"[[:<:]]{0}".format(searchStr))