Ответ 1
d = Image.objects.filter(**{'image__endswith': "jpg"})
В частности, я пытаюсь использовать строку для произвольного фильтра 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.
d = Image.objects.filter(**{'image__endswith': "jpg"})
Параметр eval
должен работать нормально, пока вы обертываете его вокруг всего выражения, а не только f
:
f = 'image__endswith="jpg"'
d = eval('Image.objects.filter(' + f + ')')
Вам нужно разделить значение из ключевого слова, а затем настроить dict, используя ключевое слово в качестве ключа, и значение в качестве значения. Затем вы можете использовать параметр функции double-asterisk с dict.
Итак...
keyword, sep, value = f.partition('=')
kwargs = {keyword: value.strip('"')}
d = Image.objects.filter(**kwargs)
Обратите внимание, что этот код предполагает, что в ключевом слове не будет никаких знаков равенства "=" (они будут использоваться только для разделения ключевого слова из значения), и значение будет заключено в кавычки.