2013-02-16 2 views
8

J'ai une liste de noms, par exemple .:Comment est-ce que je peux chaîner les recherches de champ "in" et "Iexact" de Django?

name_list = ['Alpha', 'bEtA', 'omegA'] 

Actuellement, j'ai la queryset suivante:

MyModel.objects.filter(name__in=name_list) 

Je voudrais être en mesure de filtrer les noms d'une manière insensible à la casse. Ma première pensée était d'utiliser la recherche de champs iexact mais cela ne semble pas fonctionner avec in. Comment puis-je utiliser le iexact avec la recherche de champ in pour mon jeu de requête? Ou existe-t-il un autre moyen d'effectuer cette requête?

+1

'in' ne peut pas faire insensible à la casse, vous devez itérer chaque objet fait 'iexact' et utilise des objets' Q' à combiner. – Rohan

Répondre

16

Voilà ma solution, qui utilise Q objects à la place:

name_list = ['Alpha', 'bEtA', 'omegA'] 
q_list = map(lambda n: Q(name__iexact=n), name_list) 
q_list = reduce(lambda a, b: a | b, q_list) 
MyModel.objects.filter(q_list) 
+0

+1 bon travail, cela aussi bien. Je vais l'utiliser pour référence future – catherine

+0

Je pense que la réponse de Derek est très agréable, mais je me demande si à partir de django 1.7, il est possible d'écrire une recherche personnalisée pour obtenir la même chose? https://docs.djangoproject.com/fr/1.7/howto/custom-lookups/ – bjw

2
name_list = ['Alpha', 'bEtA', 'omegA'] 
results = MyModel.objects.none() 
for name in name_list: 
    results |= MyModel.objects.filter(name__iexact=name) 

Ok je le tester et il fonctionne :)

+2

'contains' est différent de match exact. – Rohan

+2

@Rohan c'est "icontains" et non "contient". Si vous lisez attentivement la documentation de Django, vous connaissez la différence entre contains et icontains. – catherine

+0

oui vous avez raison @cathy mais 'exact' donne la correspondance exacte mais' contient' donne les résultats si l'objet correspond à des lettres dans une requête donnée dans ce cas nous pouvons obtenir des résultats non désirés :) – kartheek

Questions connexes