Django:如何在短语中搜索单词的首字母?

4
我有一个名为Author的Django模型,其中包含一个名为name的字段,该字段没有分成姓和名。
class Author(models.Model):
    name = models.CharField(max_length=200, unique=True)

例如,我有一个名为“Donald Knuth”的作者条目。
现在我想通过姓名进行查询,使用istartswith在name字段中的每个单词开头。
所以我想能够使用“Kn”进行查询,并返回“Donald Knuth”。
类似于:
```python Author.objects.filter(name__iregex=r'\mKn') ```
authors = Author.objects.filter(name__word__istartswith="Kn")

在Django中是否可能实现这个?
2个回答

2
您可以使用 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上,您可以尝试利用全文搜索功能。在其他数据库上,您需要一些额外的工具来进行高效的全文搜索(例如django-haystack)。


谢谢!这正是我需要的,只是 "(^|\s)%s" 只匹配名称开头。有什么办法可以让它匹配名称中任何单词的开头吗?我猜 "\b" 应该在某个地方参与... - AP257
所以 "(^| )%s" 是有效的,但是 "(^|\b)%s" 和 "(^|\b)%s" 不行。很好奇。 - AP257
"\b"是什么?"\s"是用于空格的POSIX字符组。你正在使用哪个数据库?尝试使用备用语法:r"(^|[[:space:]])%s" % text。 - lqc

0
在MySQL中,[[:<:]]匹配单词的开头。
searchStr = "Kn"
authors = Author.objects.filter(name__iregex=r"[[:<:]]{0}".format(searchStr))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接