Given a Django model Book with fields title (string) and year (integer), and this filter class:
import django_filters
class BookFilter(django_filters.FilterSet):
class Meta:
model = Book
fields = {"year": ["gte", "lte"]}What will BookFilter({'year__gte': 2000}).qs return?
import django_filters class BookFilter(django_filters.FilterSet): class Meta: model = Book fields = {"year": ["gte", "lte"]} # Assume Book.objects.all() contains books with years 1995, 2000, 2005
Look at the filter field name and the query parameter key.
The filter year__gte applies a 'greater than or equal' filter on the year field, so only books from 2000 and later are included.
Choose the correct django-filter field definition to filter a name CharField with case-insensitive substring matching.
import django_filters class PersonFilter(django_filters.FilterSet): name = ??? class Meta: model = Person fields = ['name']
Look for the lookup expression that ignores case and checks substring.
icontains means case-insensitive substring match, which fits the requirement.
Given this filter class:
class ProductFilter(django_filters.FilterSet):
price = django_filters.NumberFilter(lookup_expr='gte')
class Meta:
model = Product
fields = ['price', 'category']And the query ProductFilter({'price__gte': 100}).qs raises django.core.exceptions.FieldError. Why?
class ProductFilter(django_filters.FilterSet): price = django_filters.NumberFilter(lookup_expr='gte') class Meta: model = Product fields = ['price', 'category'] # Product model has fields: price (DecimalField), category (ForeignKey)
Check how django-filter builds query parameters from filter fields and lookup expressions.
When you set lookup_expr='gte' on a filter field named 'price', the filter expects query param 'price', not 'price__gte'. Using 'price__gte' causes a FieldError.
Given a model Order with a status CharField and this filter:
class OrderFilter(django_filters.FilterSet):
status = django_filters.CharFilter(lookup_expr='exact')
class Meta:
model = Order
fields = ['status']
# Assume Order.objects.all() has 10 orders: 4 with status 'pending', 6 with status 'shipped'What is OrderFilter({'status': 'pending'}).qs.count()?
class OrderFilter(django_filters.FilterSet): status = django_filters.CharFilter(lookup_expr='exact') class Meta: model = Order fields = ['status'] # Orders: 4 pending, 6 shipped
Filter matches exact status 'pending'.
The filter returns only orders with status exactly 'pending', which are 4.
How does django-filter apply filters to a queryset when you call FilterSet(data).qs?
Think about how Django ORM queries are built and executed lazily.
django-filter builds a queryset by chaining filter() calls with the lookup expressions and data, which Django ORM translates to SQL and executes lazily.