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')