5

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.

user2194805
  • 1,201
  • 1
  • 17
  • 35

1 Answers1

8

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.

Willem Van Onsem
  • 443,496
  • 30
  • 428
  • 555