2010-11-24 5 views
1

MyModel.objects.filter(field__icontains=value) renvoie toutes les lignes dont field contient value. Comment faire le contraire? À savoir, construire un jeu de requête qui retourne toutes les lignes dont fieldest contenu dans value?Django: comment filtrer les lignes dont les champs sont contenus dans la valeur passée?

De préférence sans utiliser SQL personnalisé (c'est-à-dire en utilisant uniquement l'ORM) ou sans utiliser de SQL dépendant du backend.

Répondre

3

field__icontains et similaires sont codés directement dans l'ORM. L'autre version simple n'existe pas. Vous pouvez utiliser le paramètre where décrit sous reference for QuerySet.

Dans ce cas, vous pouvez utiliser quelque chose comme:

MyModel.objects.extra(where=["%s LIKE CONCAT('%%',field,'%%')"], params=[value]) 

Bien sûr, gardez à l'esprit que il n'y a pas de méthode standard de concaténation dans DMBS. Donc, autant que je sache, il n'y a aucun moyen de satisfaire votre exigence d'éviter le SQL dépendant du backend.

Si vous êtes d'accord avec le travail avec une liste de dictionnaires plutôt que d'un queryset, vous pouvez toujours le faire à la place:

qs = MyModel.objects.all().values() 
matches = [r for r in qs if value in r[field]] 

bien que ce soit évidemment pas idéal pour d'énormes ensembles de données.

Questions connexes