I’ve worked extensively with Django, the powerful web framework that makes building web applications a breeze. One of the features I use daily is Django’s filter() method. It’s an essential tool that helps you retrieve exactly the data you need from your database without any unnecessary overhead.
If you’ve ever struggled with retrieving specific records or wanted to optimize your database queries, this article is for you. I’ll walk you through how to use Django’s filter() method effectively, share different filtering techniques, and show you how to combine filters to build complex queries.
What Is Django Filter and Why Should You Use It?
In Django, querying your database efficiently is crucial for performance and user experience. The filter() method allows you to fetch records that meet certain criteria. Unlike get() which returns a single object, filter() returns a QuerySet, a collection of objects matching your conditions.
From my experience building applications for U.S.-based clients, filtering data such as user profiles, orders, or location-specific content is common. For example, you might want to filter customers from California or orders placed in the last month. Django’s filter() makes this easy and readable.
Check out Create a Contact Form with Django and SQLite
Basic Usage of Django Filter
The simplest way to use filter() is by passing keyword arguments that correspond to your model’s fields.
# Example: Filtering customers from California
customers_in_ca = Customer.objects.filter(state='CA')This returns all Customer objects where the state field matches ‘CA’. It’s simple, efficient, and clear.
Use Field Lookups for Advanced Filtering
Django’s ORM supports powerful field lookups that let you filter data beyond exact matches. These lookups are appended to the field name with a double underscore (__).
Here are some common examples I use frequently:
- Exact match (default):
orders = Order.objects.filter(status='completed')- Case-insensitive match:
users = User.objects.filter(email__iexact='john@example.com')- Contains substring:
products = Product.objects.filter(name__icontains='laptop')- Greater than / Less than:
recent_orders = Order.objects.filter(order_date__gte='2024-01-01')- In a list of values:
states = ['CA', 'NY', 'TX']
customers = Customer.objects.filter(state__in=states)These lookups are incredibly useful when working with real-world data. For example, filtering orders placed after a certain date or customers whose email contains a specific domain.
Read Add Google reCAPTCHA to Django Form
Combine Multiple Filters
Often, you need to filter data based on multiple conditions. Django lets you chain multiple filters or use the Q objects for complex queries.
Method 1: Chain Filters
Chaining filters applies an AND condition between them.
# Customers from CA with premium membership
premium_ca_customers = Customer.objects.filter(state='CA').filter(membership='premium')This is equivalent to:
premium_ca_customers = Customer.objects.filter(state='CA', membership='premium')Open app/models.py and add:
from django.db import models
class Customer(models.Model):
name = models.CharField(max_length=100)
state = models.CharField(max_length=2)
membership = models.CharField(max_length=20)
def __str__(self):
return f"{self.name} ({self.state}, {self.membership})"admin.py
from django.contrib import admin
from .models import Customer
admin.site.register(Customer)You can see the output in the screenshot below.

Check out Build a Django Contact Form with Email
Method 2: Use Q Objects for OR Conditions
When you want to filter records that match either of multiple conditions, use Q objects.
from django.db.models import Q
# Customers from CA OR NY
customers = Customer.objects.filter(Q(state='CA') | Q(state='NY'))You can also combine AND and OR conditions:
# Premium customers from CA or NY
customers = Customer.objects.filter(
Q(state='CA') | Q(state='NY'),
membership='premium'
)You can see the output in the screenshot below.

From my experience, Q objects are invaluable when building complex filters dynamically, especially in applications that serve diverse U.S. regions.
Filter with Related Models
Django’s ORM allows you to filter based on related fields using the double underscore notation.
For example, if you have an Order model related to a Customer model, you can filter orders by the customer’s state:
# Orders where customer is from California
orders = Order.objects.filter(customer__state='CA')This saves time and lines of code by querying across relationships seamlessly.
Read How to Use Python Django pre_save
Filter Dates and Times
Working with dates is a common task, especially in business applications like sales tracking or user activity logs.
Django supports various date lookups:
- Filtering by year, month, day:
# Orders placed in January 2024
january_orders = Order.objects.filter(order_date__year=2024, order_date__month=1)- Filtering by date range:
from datetime import date
start_date = date(2024, 1, 1)
end_date = date(2024, 1, 31)
january_orders = Order.objects.filter(order_date__range=(start_date, end_date))These filters allow you to build reports or dashboards specific to time periods, which is crucial for business intelligence.
Check out Run Python Script in Django
Exclude Records with exclude()
Sometimes, you want to filter out records matching certain criteria. Django provides the exclude() method for this purpose.
# Customers not from California
non_ca_customers = Customer.objects.exclude(state='CA')You can combine exclude() with filter() for more refined queries.
Filter with Annotations and Aggregations
For more advanced querying, you can use annotate() with filters to calculate aggregates like counts or sums.
from django.db.models import Count
# Customers with more than 5 orders
customers = Customer.objects.annotate(order_count=Count('order')).filter(order_count__gt=5)This is useful when you want to filter based on aggregated data, such as active customers or popular products.
Read Python Django Round to Two Decimal Places
Tips from My Experience
- Use
.values()or.values_list()if you only need specific fields. It reduces memory usage and speeds up queries. - Avoid filtering large datasets without indexes. Make sure your database fields used in filters are indexed for faster lookups.
- Leverage Django Debug Toolbar to monitor your queries and optimize filters.
- Be mindful of chaining filters vs. combining them in one call. Both work, but chaining can sometimes create more readable code.
Filtering data effectively is a fundamental skill when working with Django. Whether you’re building a customer portal, an e-commerce site, or a data dashboard, mastering the filter() method empowers you to write clean, efficient, and maintainable code.
I hope this guide helps you understand the power of Django filtering better. If you have any questions or want to share your tips, feel free to leave a comment below!
Other Python tutorials you may also like:
- Python Django Form Validation
- How to Encrypt and Decrypt Passwords in Django
- Python Django Concatenate String

I am Bijay Kumar, a Microsoft MVP in SharePoint. Apart from SharePoint, I started working on Python, Machine learning, and artificial intelligence for the last 5 years. During this time I got expertise in various Python libraries also like Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn, etc… for various clients in the United States, Canada, the United Kingdom, Australia, New Zealand, etc. Check out my profile.