Django requête de la casse de la liste de match
J'ai une liste de noms que je veux correspondre à la casse, est-il un moyen de le faire sans l'aide d'une boucle comme ci-dessous?
a = ['name1', 'name2', 'name3']
result = any([Name.objects.filter(name__iexact=name) for name in a])
Vous devez vous connecter pour publier un commentaire.
Unfortunatley, il y a pas
__iin
champ de recherche. Mais il y a uniregex
qui pourraient être utiles, comme:ou encore:
Noter que si l'une peut contenir des caractères spéciaux dans une expression régulière, vous devez échapper correctement.
NEWS: Djano 1.7 il est possible de créer vos propres recherches, de sorte que vous pouvez réellement utiliser
filter(name__iin=['name1', 'name2', 'name3'])
après l'initialisation correcte. Voir https://docs.djangoproject.com/en/1.7/ref/models/lookups/ pour plus de détails.result = Name.objects.filter(name__iregex=r'^(' + '|'.join([re.escape(b) for b in a]) + ')$')
Dans Postgresql, vous pouvez essayer de créer un casse index comme décrit ici:
https://stackoverflow.com/a/4124225/110274
Puis exécutez une requête:
Index de recherche, de courir plus vite que l'expression rationnelle correspondant à la requête.
Un autre moyen de cette aide django fonctions de requête et d'annotation
Garder à l'esprit que, au moins dans MySQL, vous devez définir
utf8_bin
classement dans vos tables pour les réaliser sensible à la casse. Sinon, ils sont cas la préservation de mais insensible à la casse. E. g.Donc, si la portabilité n'est pas crucial et que vous utilisez MySQL, vous pouvez choisir d'ignorer le problème complètement.
Ajouter sur ce Rasmuj dit, s'échapper de l'entrée utilisateur comme
Je suis en expansion Exgeny idée en deux liner.
Voici un exemple de la coutume de l'Utilisateur modèle
classmethod
pour filtrer les utilisateurs par e-mail à la casse