2010-11-28 19 views
21

J'essaye de faire une requête django, mais avec la possibilité de plusieurs paramètres différents de WHERE. J'étais tellement pensais faire quelque chose comme:Utilisation d'une chaîne comme argument d'une requête de filtre Django

querystring = "subcat__id__in=[1,3,5]" 
Listing.objects.filter(querystring) 

ici Listing est défini dans mon modèle, et il contient le Many-to-Many champ « subcat ». Cependant, cela provoque une erreur ValueError car le filtre n'accepte pas une chaîne comme argument. Y at-il un moyen en Python d'avoir une chaîne évaluée comme son contenu plutôt que comme une chaîne? Quelque chose comme une instruction d'impression qui imprime la valeur de la chaîne en ligne plutôt que la sortie standard.

Par ailleurs, la raison pour laquelle je ne filtrer pas seulement faire

querystring = [1,3,5] 
Listing.objects.filter(subcat__id__in=querystring) 

est que je ne suis pas toujours subcat__id, il est parfois un ou plusieurs autres paramètres, et je devrais plutôt pas écrire un tas de requêtes séparées contrôlées par des instructions if. Tout conseil est fort apprécié.

Répondre

52

Peut-être ...

filter_dict = {'subcat__id__in': [1,3,5]} 
Listing.objects.filter(**filter_dict) 
+0

parfait, c'est exactement ce que je cherchais! Merci beaucoup. – danny

+0

@danny Réponse acceptée alors? = P –

9
Listing.objects.filter(**{"subcat__id__in": ast.literal_eval("[1,3,5]")})