2010-05-28 4 views
36

특히 ORM을 필터링하는 문자열을 사용하려고합니다. 나는 임원 및 평가 솔루션을 시도했지만 벽에 부딪 히고있다. 어디가 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

를 이동하기 위해 노력하고있어 아래의 코드는 작동하지 않지만, 내가 설명하는 방법을 알고있는 가장 좋은 방법입니다 전체 표현식뿐 아니라 f :

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

당신은 키워드의 값을 분할 한 후 키와 키워드를 사용하여 DICT, 값으로 값을 설정해야 할 것입니다. 그런 다음 dict와 함께 double -sterster 함수 매개 변수를 사용할 수 있습니다.

그래서 ...

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

참고이 코드는 (그들은 단지 값에서 키워드를 구분하는 데 사용됩니다) 어떤 키워드에 표지판을 '='동일 없을 것으로 가정 값은 따옴표로 묶입니다.

+0

스트립하지 마십시오. 대신에'ast.literal_eval()'을 사용하십시오. –

+0

그렇다면,'datetime.date (2005, 1, 3)'을 유효한 필터로 잡으려 고한다면, 정규식 eval()을 사용할 수 있습니까? –

관련 문제