2010-05-28 58 views
36

具體來說,我試圖使用一個字符串來任意過濾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. 

回答

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

eval選項應該可以正常工作,只要你把它包在周圍整個表達式,而不只是f

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

你需要從關鍵字拆分出來的值,然後設置使用關鍵字爲重點的字典,並將該值作爲值。然後你可以在字典中使用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

相關問題