2010-05-28 19 views
36

Özellikle, ORM'yi arbitrairly filtrelemek için bir dize kullanmaya çalışıyorum. Exec ve eval çözümlerini denedim, ama duvarlara koşuyorum. nerede eval seçenek etrafına sarın sürece, iyi çalışması gerekirBir dizeyi anahtar kelime argümanı olarak nasıl kullanırım?

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. 

cevap

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

gitmeye çalışıyorum aşağıdaki kod çalışmaz, ama ben açıklamak biliyorum en iyi yoldur tüm ifade, sadece f:

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

Sen, anahtar kelimeden değerini bölünmüş sonra anahtar olarak anahtar kelime kullanarak bir dicti ve değer olarak değerini ayarlamak gerekiyordu. Daha sonra çift yıldız işareti işlevini paragrafla kullanabilirsiniz.

So ...

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

Not bu kod (yalnızca değerinden anahtar kelimeyi ayırmak için kullanılan olacağım) herhangi bir anahtar kelime işaretler '=' eşittir olmayacak varsayar ve değer tırnak içine alınacaktır.

+0

Şeritlemeyin. Bunun yerine 'ast.literal_eval()' işlevini kullanın. –

+0

Tamam, bununla ilgili olarak, geçerli bir süzgeç olarak datetime.date (2005, 1, 3) 'ü de yakalamak isteseydim düzenli bir değerlendirmeyi kullanabilir miyim? –

İlgili konular