Подтвердить что ты не робот

Как использовать строку в качестве аргумента ключевого слова?

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

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Итак...

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

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