2010-05-28 13 views
36

Específicamente, estoy tratando de usar una cadena para filtrar arbitrariamente el ORM. Probé soluciones ejecutivas y de evaluación, pero me topé con paredes. El código siguiente no funciona, pero es la mejor manera que sé cómo explicar dónde estoy tratando de ir¿Cómo uso una cadena como argumento de palabra clave?

from gblocks.models import Image 
f = 'image__endswith="jpg"' # Would be scripted in another area, but passed as text <user input> 
d = Image.objects.filter(f) 


#for the non-django pythonistas: 
d = Image.objects.filter(image__endswith="jpg") 
# would be the non-dynamic equivalent. 

Respuesta

69
d = Image.objects.filter(**{'image__endswith': "jpg"}) 
2

La opción eval debería funcionar bien, siempre y cuando se envuelve alrededor de la toda expresión, no sólo el f:

f = 'image__endswith="jpg"' 
d = eval('Image.objects.filter(' + f + ')') 
2

Usted había necesidad de dividir el valor de la palabra clave, a continuación, establecer un diccionario usando la palabra clave como la clave y el valor como el valor. A continuación, puede utilizar el paramater de función de doble asterisco con el dict.

Entonces ...

keyword, sep, value = f.partition('=') 
kwargs = {keyword: value.strip('"')} 
d = Image.objects.filter(**kwargs) 

Nota, este código se supone que no habrá ninguna signos de igualdad '=' en la palabra clave (que sólo va a utilizar para separar la palabra clave a partir del valor) y el valor se envolverá entre comillas.

+0

No lo desviste. Use 'ast.literal_eval()' en su lugar. –

+0

Ok, relacionado con eso, ¿podría usar una evaluación regular() si también quisiera capturar 'datetime.date (2005, 1, 3)' como un filtro válido? –

Cuestiones relacionadas