Django correspondance approximative de chaînes de caractères unicode avec équivalents ASCII
-
21-09-2019 - |
Question
Je le modèle et exemple suivant:
class Bashable(models.Model):
name = models.CharField(max_length=100)
>>> foo = Bashable.objects.create(name=u"piñata")
Maintenant, je veux être en mesure de rechercher des objets, mais en utilisant des caractères ascii plutôt que unicode, quelque chose comme ceci:
>>> Bashable.objects.filter(name__lookslike="pinata")
Y at-il un moyen de Django pour faire ce genre de correspondance de chaîne approximative, en utilisant ascii-ins pour se tenir les caractères unicode dans la base de données?
Voici une question concernant , mais pour les données de base d'Apple.
La solution
Essayez contre un « de-accentués » liste des noms si la recherche initiale échoue. Voici une fonction PHP remove_accents qui pourrait être traduit en python facilement: 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
Et voici une entrée stackoverflow sur la correspondance de chaîne floue en python: # 682367
Autres conseils
La première réponse à cette question href="https://stackoverflow.com/questions/1410308/how-to-implement-unicode-string-matching-by-folding-in-python"> montre comment utiliser la fonction strip_accents
qui est une fonction python pour obtenir ce que vous voulez. Ce n'est pas techniquement partie de Django, mais il est construit en Python.