Using Q object with variable
Asked Answered
C

1

6

I'd like to use the django.db.models.Q object in a way that the query term is coming from a variable.

What i'd like to achieve is identical to this:

q = Q(some_field__icontains='sth')
Obj.objects.filter(q)

, but the some_field value should come from a variable:

field_name='some_field'
q = Q('%s__icontains=sth' % field_name)
Obj.objects.filter(q)

, but this solution does not give me the correct result of course.

I also tried to use dictionary this way:

dt = {'%s__icontains' % field_name: 'sth'}
q = Q(**dt)
Obj.objects.filter(q)

, but this also fails on the result.

How could I use the Q object using variables as query term?

Thanks.

Commentative answered 28/9, 2020 at 16:18 Comment(3)
What do you mean with "fails on the result"?Audriaaudrie
It does not returns the correct (the expected) number of results. Actually it results 0.Commentative
Are you sure field_name is the some_field here? If you work with another field_name, of course the result can be different.Audriaaudrie
A
9

You can pass a 2-tuple to a Q object with the name of the fieldname(s) and lookups as first item, and the value as second item:

Obj.objects.filter(Q(('%s__icontains' % field_name, 'sth')))

this is probably the most convenient way. That being said the dictionary unpacking, although less elegant, should also work.

Audriaaudrie answered 28/9, 2020 at 16:20 Comment(3)
Unfortunately the dictionary way does not work, but your solution does! Thanks.Commentative
I am surprised that Obj.objects.filter(Q(**dt)) didn't work, but why? 🤔🤔Ramakrishna
Unpacking definitely works. Worked for me.Ameeameer

© 2022 - 2024 — McMap. All rights reserved.