This example shows how to get all products that have stock available by excluding those with zero stock.
Django
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
stock = models.IntegerField()
# Imagine we have these products in the database:# Product(name='Pen', stock=10)# Product(name='Notebook', stock=0)# Product(name='Eraser', stock=5)# Query to get all products that are NOT out of stock
available_products = Product.objects.exclude(stock=0)
for product in available_products:
print(product.name)
OutputSuccess
Important Notes
exclude() is the opposite of filter(). Use it when you want to remove certain records.
You can use double underscores to filter on related fields inside exclude().
Summary
exclude() helps you get all records except those matching a condition.
It is useful to remove unwanted items from your query results.
You can combine exclude() with other QuerySet methods for flexible queries.
Practice
(1/5)
1. What does the Django QuerySet method exclude() do?
easy
A. Returns only the records that match the given condition.
B. Deletes records that match the given condition.
C. Returns all records except those that match the given condition.
D. Updates records that match the given condition.
Solution
Step 1: Understand the purpose of exclude()
The exclude() method filters out records matching the condition, so it returns everything else.
Step 2: Compare with other QuerySet methods
Unlike filter() which returns matching records, exclude() returns the opposite set.
Final Answer:
Returns all records except those that match the given condition. -> Option C
Quick Check:
exclude() means NOT matching [OK]
Hint: Think 'exclude' as 'leave out' matching items [OK]
Common Mistakes:
Confusing exclude() with filter()
Thinking exclude() deletes records
Assuming exclude() updates records
2. Which of the following is the correct syntax to exclude users with the username 'admin' from a QuerySet?
easy
A. User.objects.filter(Q(username='admin'))
B. User.objects.exclude(username='admin')
C. User.objects.exclude(username!='admin')
D. User.objects.filter(username!='admin')
Solution
Step 1: Recall correct exclude() syntax
The exclude() method takes keyword arguments like username='admin' to exclude matching records.
Step 2: Check other options for syntax errors
User.objects.filter(username!='admin') uses invalid syntax for filter; User.objects.exclude(username!='admin') excludes records not matching 'admin' which is wrong; User.objects.filter(Q(username='admin')) returns only matching records.
Final Answer:
User.objects.exclude(username='admin') -> Option B
Quick Check:
exclude() uses keyword args directly [OK]
Hint: Use exclude(field=value) to leave out matching records [OK]
Common Mistakes:
Using != inside filter() which is invalid
Misplacing negation inside exclude()
Confusing filter(Q()) with exclude() syntax
3. Given the model Product with a boolean field is_active, what will Product.objects.exclude(is_active=False) return?
medium
A. No products, it causes an error.
B. All products where is_active is false.
C. All products regardless of is_active value.
D. All products where is_active is true.
Solution
Step 1: Understand exclude condition
exclude(is_active=False) removes products where is_active is false.
Step 2: Determine remaining records
Remaining products have is_active=True, so only active products remain.
Final Answer:
All products where is_active is true. -> Option D
Quick Check:
Exclude false means keep true [OK]
Hint: Exclude false means keep true records [OK]
Common Mistakes:
Thinking exclude removes true records
Assuming exclude returns all records
Confusing exclude with filter
4. What is wrong with this Django query: MyModel.objects.exclude('status'='inactive')?
medium
A. Using quotes around the field name inside exclude() is invalid syntax.
B. exclude() cannot be used with string fields.
C. The equal sign should be double == inside exclude().
D. exclude() requires a Q object, not keyword arguments.
Solution
Step 1: Check exclude() argument syntax
exclude() expects keyword arguments without quotes around field names, e.g., status='inactive'.
Step 2: Identify syntax error
Using quotes around 'status' makes it a string, which is invalid syntax for keyword arguments.
Final Answer:
Using quotes around the field name inside exclude() is invalid syntax. -> Option A
Quick Check:
Field names are keywords, no quotes [OK]
Hint: Don't put quotes around field names in exclude() [OK]
Common Mistakes:
Putting quotes around field names
Using == instead of = in keyword args
Thinking exclude() needs Q objects always
5. You have a model Order with a field status that can be 'pending', 'shipped', or 'cancelled'. How would you write a query to get all orders except those that are 'cancelled' or 'pending'?
hard
A. Order.objects.exclude(status__in=['cancelled', 'pending'])
B. Order.objects.filter(~Q(status='cancelled') | ~Q(status='pending'))
C. Order.objects.exclude(status='cancelled', status='pending')
D. Order.objects.filter(status!='cancelled' and status!='pending')
Solution
Step 1: Understand the goal
We want to exclude orders with status 'cancelled' or 'pending'.
Step 2: Use exclude() with __in lookup
Using exclude(status__in=[...]) excludes all orders with any status in the list efficiently.
Step 3: Check other options
Order.objects.exclude(status='cancelled', status='pending') is invalid (duplicate keyword arg); Order.objects.filter(~Q(status='cancelled') | ~Q(status='pending')) uses OR logic on negated Qs (wrong, keeps most records); Order.objects.filter(status!='cancelled' and status!='pending') uses invalid syntax.
Final Answer:
Order.objects.exclude(status__in=['cancelled', 'pending']) -> Option A
Quick Check:
Use exclude() with __in for multiple values [OK]
Hint: Use exclude(field__in=[...]) to exclude multiple values [OK]
Common Mistakes:
Using duplicate keyword arguments in exclude()
Using invalid syntax in filter()
Not using __in lookup for multiple values
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.