AP257
AP257

Reputation: 93783

Django: search on first letters of individual words within phrase?

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

Answers (2)

Sandeep G
Sandeep G

Reputation: 371

For MySQL, [[:<:]] matches the beginning of the word.

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

Upvotes: 0

lqc
lqc

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

Related Questions