[Django]-Django query negation

98đź‘Ť

âś…

You can use exclude() in place of filter():

Entry.objects.exclude(name__contains="SomeString")

(“give me all entries EXCEPT those with names containing “SomeString”)

And when dealing with Q object you can use “~” symbol before Q object to represent negation. For example the following statement means “give me all Entries with names containing “Elephant”, but NOT containing “SomeString”:

Entry.objects.filter(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))

In some cases you may want to use both methods:

Entry.objects.exclude(Q(name__contains="Elephant") & ~Q(name__contains="SomeString"))

(“give me all entries, EXCEPT those with names containing “Elephant”, but NOT containing “SomeString”)

7đź‘Ť

Here’s the QuerySet API reference. exclude seems to do what you want.

👤Hank Gay

3đź‘Ť

Either use exclude as Hank suggests or, for the particular contains case, use Q(name__regex=r’!(SomeString)’) if you really really need to use the filter. Be warned though that regex is not database-agnostic, check what syntax your db supports first.

👤kibitzer

Leave a comment