Skip to content

Q Objects

The filter(), exclude(), and get() methods accept Q objects for building complex conditions with AND, OR, and NOT operators.

from amsdal.queryset import Q

AND — &

Multiple kwargs within a single Q are ANDed:

# gender == "male" AND age > 60
Q(gender='male', age__gt=60)

Combine Q objects with &:

Q(gender='male') & Q(age__gt=60)

OR — |

# (gender == "male" AND age > 60) OR (gender == "female" AND age > 50)
Q(gender='male', age__gt=60) | Q(gender='female', age__gt=50)

NOT — ~

# age < 18 OR gender != "female"
Q(age__lt=18) | ~Q(gender='female')

Nesting

Build arbitrarily complex conditions:

# gender == "male" AND (age < 18 OR age > 21)
Q(gender='male') & Q(Q(age__lt=18) | Q(age__gt=21))

Using with QuerySets

Pass Q objects as positional arguments to filter() and exclude(). You can mix them with keyword arguments:

from amsdal.queryset import Q

conditions = Q(age__lt=18) | Q(gender='female')

qs = Person.objects.filter(
    conditions,
    city='London',
).exclude(
    Q(name='John') | Q(name='Bob'),
)

Negating a Q and using exclude() are equivalent:

qs = Person.objects.filter(~Q(gender='male'))
# same as:
qs = Person.objects.exclude(gender='male')