【问题标题】:Django approximate matching of unicode strings with ascii equivalentsDjango 将 unicode 字符串与 ascii 等效项进行近似匹配
【发布时间】:2011-01-29 15:00:19
【问题描述】:

我有以下模型和实例:

class Bashable(models.Model):
    name = models.CharField(max_length=100)

>>> foo = Bashable.objects.create(name=u"piñata")

现在我希望能够搜索对象,但使用 ascii 字符而不是 unicode,如下所示:

>>> Bashable.objects.filter(name__lookslike="pinata")

在 Django 中有没有一种方法来做这种近似的字符串匹配,使用 ascii 替代数据库中的 unicode 字符?

这是related question,但用于 Apple 的核心数据。

【问题讨论】:

    标签: django unicode ascii matching approximate


    【解决方案1】:

    如果初始搜索失败,请尝试搜索“去重音”的名称列表。这是一个可以轻松翻译成 python 的 php remove_accents 函数:remove_accents()

    query = u"pinata"
    r = Bashable.objects.filter(name=query)
    if not r:
        accented = Bashable.objects.values('id', 'name')
        match_ids = [ obj['id'] for obj in accented 
                                    if query in remove_accents(obj['name']) ]
        r = Blog.objects.in_bulk(match_ids)
    return r
    

    这里有一个关于python中模糊字符串匹配的stackoverflow条目:#682367

    【讨论】:

    • 这看起来是一个合理的解决方案。能够在单个查询中在数据库级别更有效地执行此操作会很好,但看起来 PostgreSQL 至少不支持它(尚未检查其他)。 Pace 的解决方案[1] 指向了重音去除的实现。 [1]stackoverflow.com/questions/2480159/…
    【解决方案2】:

    this question 的第一个答案展示了如何使用strip_accents 函数,这是一个 python 函数来实现你想要的。从技术上讲,它不是 Django 的一部分,但它内置于 Python 中。

    【讨论】:

      猜你喜欢
      • 2023-03-23
      • 2015-05-22
      • 2011-05-11
      • 2013-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多