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

时间:2010-05-28 21:26:41

标签: python django

具体来说,我正在尝试使用字符串来任意过滤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.

3 个答案:

答案 0 :(得分:81)

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

答案 1 :(得分:3)

eval选项应该可以正常工作,只要将其包裹在整个表达式中,而不仅仅是f

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

答案 2 :(得分:3)

您需要从关键字中拆分值,然后使用关键字作为键设置dict,并将值设置为值。然后你可以使用带有字典的双星号函数参数。

因此...

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

注意,此代码假定关键字中不存在任何等号'='(它们仅用于将关键字与值分开),并且值将用引号括起来。