Reputation: 10483
I'm trying to do a django query, but with the possibility of several different WHERE
parameters. So I was thinking of doing something like:
querystring = "subcat__id__in=[1,3,5]"
Listing.objects.filter(querystring)
Here Listing is defined in my model, and it contains the Many-To-Many field subcat
. However, that raises a ValueError
because filter doesn't accept a string as its argument. Is there a way in Python to have a string evaluated as just its contents rather than as a string? Something like a print statement that prints the value of the string inline rather than to the standard output.
By the way, the reason I don't just do
querystring = [1,3,5]
Listing.objects.filter(subcat__id__in=querystring)
is that I'm not always filtering for subcat__id
, sometimes it's one or several other parameters, and I'd rather not have to write out a bunch of separate queries controlled by if statements. Any advice is much appreciated.
Upvotes: 32
Views: 15432
Reputation: 11
You can do an OR query like this:
from functools import reduce
from operator import or_
query_as_dict = {"subcat__id__in": [1,3,5], "cat__id": 9}
query = reduce(or_, (Q(**{key: value}) for key, value in query_as_dict.items()))
Listing.objects.filter(query)
Upvotes: 1
Reputation: 48730
Perhaps...
filter_dict = {'subcat__id__in': [1,3,5]}
Listing.objects.filter(**filter_dict)
Upvotes: 82
Reputation: 799310
Listing.objects.filter(**{"subcat__id__in": ast.literal_eval("[1,3,5]")})
Upvotes: 9