【问题标题】:Django: search on first letters of individual words within phrase?Django:在短语中搜索单个单词的首字母?
【发布时间】:2026-02-18 16:05:03
【问题描述】:

我有一个名为 Author 的 Django 模型,其中包含一个名为 name 的字段,该字段未拆分为姓/名:

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

例如,我有一个名为“Donald Knuth”的作者条目。

现在我想按名称进行查询,在 name 字段中的每个单词的开头使用 istartswith

所以我希望能够使用“Kn”进行查询,并返回“Donald Knuth”。

类似:

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

这在 Django 中可行吗?

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

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

    【讨论】:

    • 谢谢!这正是我所需要的,除了 "(^|\s)%s" 只匹配名称的开头。知道如何使它与名称中任何单词的开头相匹配吗?我猜“\b”应该在某处涉及......
    • 所以 "(^| )%s" 有效,但 "(^|\b)%s" 和 "(^|\b)%s" 无效。好奇。
    • 什么是“\b”? "\s" 是用于空格的 POSIX 字符组。你用的是什么数据库?尝试使用替代语法: r"(^|[[:space:]])%s" % text
    【解决方案2】:

    对于 MySQL,[[:<:>

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

    【讨论】: