Reputation: 93783
I've got a Django model called Author
, with a field called name
, which isn't split up into lastname/firstname:
class Author(models.Model):
name = models.CharField(max_length=200, unique=True)
For example, I have an Author entry with name 'Donald Knuth'.
Now I'd like to query by name, using istartswith at the start of each word within the name
field.
So I'd like to be able to query with 'Kn
', and get 'Donald Knuth
' back.
Something like:
authors = Author.objects.filter(name__word__istartswith="Kn")
Is this possible in Django?
Upvotes: 4
Views: 3539
Reputation: 371
For MySQL, [[:<:]] matches the beginning of the word.
searchStr = "Kn"
authors = Author.objects.filter(name__iregex=r"[[:<:]]{0}".format(searchStr))
Upvotes: 0
Reputation: 7328
You can use iregex
lookup:
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)
This isn't very efficient, but should work. On MySQL you can try taking advantage of full-text search features. On other DBs you'll need some extra tools to make an efficient full-text search (like django-haystack).
Upvotes: 2