具体来说,我正在尝试使用字符串来任意过滤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.
答案 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)
注意,此代码假定关键字中不存在任何等号'='(它们仅用于将关键字与值分开),并且值将用引号括起来。