D. Slicing before filtering breaks chaining; filter cannot be applied after slicing
Solution
Step 1: Understand slicing effect
Slicing a queryset (like [:10]) evaluates it and returns a list, not a queryset.
Step 2: Applying filter after slicing
Since qs is now a list, calling filter() on it causes an error or unexpected behavior.
Final Answer:
Slicing before filtering breaks chaining; filter cannot be applied after slicing -> Option D
Quick Check:
Slice first = no chaining [OK]
Hint: Always filter before slicing to keep queryset chaining intact [OK]
Common Mistakes:
Slicing before filtering
Assuming slicing returns a queryset
Trying to chain after slicing
5. You want to get all active users aged 18 or older, but exclude those whose names start with 'A' or 'B'. Which queryset chaining is correct?
hard
A. MyModel.objects.filter(active=True).filter(age__gte=18).exclude(name__startswith=['A', 'B'])
B. MyModel.objects.filter(active=True).filter(age__gte=18).exclude(name__startswith='A').exclude(name__startswith='B')
C. MyModel.objects.filter(active=True).exclude(name__startswith='A', name__startswith='B').filter(age__gte=18)
D. MyModel.objects.filter(active=True, age__gte=18).exclude(name__startswith='A' or 'B')
Solution
Step 1: Filter active and age
Use two filters or one combined filter to get active users aged 18 or older.
Step 2: Exclude names starting with 'A' and 'B'
Exclude separately for 'A' and 'B' because exclude(name__startswith='A' or 'B') is invalid syntax and exclude(name__startswith=['A', 'B']) is not supported.
Final Answer:
MyModel.objects.filter(active=True).filter(age__gte=18).exclude(name__startswith='A').exclude(name__startswith='B') -> Option B
Quick Check:
Chain filters then multiple excludes correctly [OK]
Hint: Chain filters first, then exclude each condition separately [OK]