2010-12-08 18 views
2

J'ai un modèle Django appelé Author, avec un champ appelé name, qui est divisé en pas Nom/Prénom:Django: recherche sur les premières lettres de mots individuels dans la phrase?

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

Par exemple, j'ai une entrée avec le nom de l'auteur Donald Knuth ' .

Maintenant, j'aimerais interroger par son nom, en utilisant istartswith au début de chaque mot dans le champ name.

Donc, je voudrais être en mesure d'interroger avec 'Kn', et obtenir 'Donald Knuth' de retour.

Quelque chose comme:

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

Est-ce possible dans Django?

Répondre

1

Vous pouvez utiliser iregex recherche:

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) 

Ce n'est pas très efficace, mais devrait fonctionner. Sur MySQL, vous pouvez essayer de profiter de full-text search features. Sur les autres DB, vous aurez besoin d'outils supplémentaires pour effectuer une recherche de texte intégral efficace (comme django-haystack).

+0

Merci! C'est exactement ce dont j'ai besoin, sauf que "(^ | \ s)% s" ne correspond qu'au début du nom. Une idée de comment je peux faire correspondre le début d'un mot dans le nom? Je devine que "\ b" devrait être impliqué quelque part ... – AP257

+0

Donc "(^ |)% s" fonctionne, mais "(^ | \ b)% s" et "(^ | \ b)% s" 't. Curieuse. – AP257

+0

Qu'est-ce qu'un "\ b"? "\ s" est un groupe de caractères POSIX pour les espaces. Quel DB utilisez-vous? Essayez d'utiliser la syntaxe alternative: r "(^ | [[: espace:]])% s"% text – lqc

0

Pour MySQL, [[: <:]] correspond au début du mot.

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