How do I use a string as a keyword argument?

Specifically, I’m trying to use a string to arbitrairly filter the ORM. I’ve tried exec and eval solutions, but I’m running into walls. The code below doesn’t work, but it’s the best way I know how to explain where I’m trying to go

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.

Answers:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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

Method 2

You’d need to split out the value from the keyword, then set up a dict using the keyword as the key, and the value as the value. You could then use the double-asterisk function paramater with the dict.

So…

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

Note, this code assumes that there won’t be any equals signs ‘=’ in the keyword (they’ll only be used to separate the keyword from the value), and the value will be wrapped in quotes.

Method 3

The eval option should work fine, as long as you wrap it around the entire expression, not just the f:

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


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x