2010-03-19 51 views
2

我有以下的模型和实例:Django的ASCII码unicode字符串的近似匹配当量

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的Core Data。

回答

1

如果初始搜索失败,请尝试使用“非重读”名称列表进行搜索。下面是一个可以很容易地转换成蟒蛇一个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 

和这里的模糊字符串匹配一个计算器条目蟒蛇:#682367

+0

这看起来像一个合理的解决方案。能够在单个查询中更高效地在数据库级别执行此操作会很好,但看起来好像PostgreSQL至少不支持它(未检查其他)。佩斯的解决方案[1]指出重音剥离的实施。 [1] http://stackoverflow.com/questions/2480159/django-approximate-matching-of-unicode-strings-with-ascii-equivalents/2480313#2480313 – user85461 2010-03-19 22:35:00

1

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

相关问题