我有字段name
和author
这是在阿拉伯语,我想对他们的关键字搜索
keyword = request.POST.get('search', '')
books = Book.objects.filter(Q(name__icontains=keyword)).order_by('category', 'code')
问题是django将两个字母''和'ا'视为两个不同的字母,而用户希望它们在搜索中可以互换,并且两者应该给予相同的输出。有没有一种方法可以将它们视为一个字母,而不用在代码的变体中替换它们?像这样
keyword_var1 = keyword.replace('أ', 'ا')
字母''和'li'也有同样的问题
1条答案
按热度按时间ig9co6j11#
这个问题是已知的,但不是Django特有的。Django没有定义自定义不敏感搜索的工作方式,这是数据库的工作。在排序或检查等价性时如何处理字符的规则集是 collation。
这个Medium article by Ahmed Essam解释了简单的utf8_unicode_ci排序的问题。如果我对这篇文章的理解是正确的,那么Unicode排序规则有一些缺点。根据数据库的不同,您可以构建一个自定义排序规则,例如,如本文所示:
它表明它将重写
\u0623
,使上面带有Hamza的Alef成为简单的Alef(u0627`),然后尝试匹配它。然后,您可以将此排序规则算法设置为这些特定列的排序规则算法,以及可能使用阿拉伯语的其他列的排序规则算法。