2010-12-08 5 views
2

Ich habe ein Django-Modell Author, mit einem Feld namens bekam name genannt, die nicht in Nachname/Vorname aufgespalten wird:Django: Suche nach Anfangsbuchstaben einzelner Wörter in einer Phrase?

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

Zum Beispiel habe ich einen Autor Eintrag mit dem Namen ‚Donald Knuth‘ haben .

Nun möchte ich nach Namen fragen, mit istartswith am Anfang jedes Wortes innerhalb der name Feld.

Also ich würde gerne in der Lage sein mit 'Kn' abzufragen, und erhalten 'Donald Knuth' zurück.

Etwas wie:

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

Ist das möglich in Django?

Antwort

1

können Sie iregex Lookup verwenden:

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) 

Dies ist nicht sehr effizient, sollte aber funktionieren. Auf MySQL können Sie versuchen, full-text search features zu nutzen. Auf anderen Datenbanken benötigen Sie einige zusätzliche Tools, um eine effiziente Volltextsuche zu erstellen (wie django-haystack).

+0

Vielen Dank! Dies ist genau das, was ich brauche, außer dass "(^ | \ s)% s" nur am Anfang des Namens übereinstimmt. Irgendeine Idee, wie ich es den Anfang jedes Wortes innerhalb des Namens zusammenbringen lassen kann? Ich denke, "\ b" sollte irgendwo beteiligt sein ... – AP257

+0

Also "(^ |)% s" funktioniert, aber "(^ | \ b)% s" und "(^ | \ b)% s" don t. Neugierig. – AP257

+0

Was ist ein "\ b"? "\ s" ist eine POSIX-Zeichengruppe für Leerzeichen. Welche DB benutzen Sie? Verwenden Sie die alternative Syntax: r "(^ | [[:: space:]])% s"% text – lqc

0

Für MySQL stimmt [[: <:]] mit dem Anfang des Wortes überein.

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