Как использовать строку в качестве аргумента ключевого слова? - PullRequest
42 голосов
/ 29 мая 2010

В частности, я пытаюсь использовать строку для произвольной фильтрации 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 ]

81 голосов
/ 29 мая 2010
d = Image.objects.filter(**{'image__endswith': "jpg"})
3 голосов
/ 29 мая 2010

Вам нужно отделить значение от ключевого слова, а затем настроить dict, используя ключевое слово в качестве ключа и значение в качестве значения. Затем вы можете использовать параметр-символ двойной звездочки с помощью dict.

Итак ...

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

Обратите внимание, в этом коде предполагается, что в ключевом слове не будет знака равенства = (они будут использоваться только для отделения ключевого слова от значения), а значение будет заключено в кавычки.

3 голосов
/ 29 мая 2010

Параметр eval должен работать нормально, если вы оберните его вокруг всего выражения, а не только f:

f = 'image__endswith="jpg"'
d = eval('Image.objects.filter(' + f + ')')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...