如何使用字符串作为关键字参数?

如何使用字符串作为关键字参数?

问题描述:

具体来说,我试图使用一个字符串来任意过滤ORM。我已经尝试了exec和eval解决方案,但是我正在碰壁。下面的代码无法正常工作,但它是我知道该怎么解释的最好方式,我试着去如何使用字符串作为关键字参数?

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. 

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

eval选项应该可以正常工作,只要你把它包在周围整个表达式,而不只是f

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

你需要从关键字拆分出来的值,然后设置使用关键字为重点的字典,并将该值作为值。然后你可以在字典中使用double-asterisk函数参数。

所以......

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

注意,此代码假定不会有任何等于在关键字的迹象“=”(他们只会被用来从价值的关键字分开) ,并将该值用引号括起来。

+0

不要剥去它。改用'ast.literal_eval()'。 – 2010-05-28 21:42:21

+0

好吧,与那个相关的话,如果我还想'datetime.date(2005,1,3)'作为有效的过滤器,我可以使用常规的eval()吗? – 2010-05-28 22:09:19