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

具体来说,我试图使用一个string来任意过滤ORM。 我已经尝试了exec和eval解决scheme,但是我正在碰壁。 下面的代码不起作用,但这是我知道如何解释我想去的地方的最佳方式

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选项应该可以正常工作,只要将它包装在整个expression式中,而不仅仅是f

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

您需要将关键字的值分开,然后使用关键字作为关键字设置字典,并将值设置为值。 然后,您可以使用字典的双星号函数参数。

所以…

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

请注意,此代码假定关键字中不会有任何等号“=”(它们只用于将关键字与值分开),并将值用引号括起来。