Support Our Site

To ensure we can continue delivering content and maintaining a free platform for all users, we kindly request that you disable your adblocker. Your contribution greatly supports our site's growth and development.

How to Perform OR Queries in Django ORM

3 min read

Django is a popular web framework for Python that provides an intuitive and powerful Object-Relational Mapping (ORM) system. The Django ORM allows developers to interact with databases using Python classes and methods, abstracting away the underlying SQL queries.

While simple queries are straightforward to create using Django's QuerySet API, complex queries may require the use of OR statements.

In this article, we will explore how to perform OR queries in Django ORM. Specifically, we will cover different techniques and examples to construct OR queries to fetch data from the database.

Understanding OR Queries in Django ORM

In the context of database queries, OR is a logical operator that retrieves records satisfying either of the specified conditions. In Django ORM, you can use the Q object to perform OR queries. The Q object allows you to encapsulate complex queries using Pythonic syntax.

Syntax of OR Queries using Q objects

To perform OR queries in Django ORM, you need to import the Q object from django.db.models and then use it to create the OR condition.

The syntax is as follows:

from django.db.models import Q result = Model.objects.filter(Q(condition1) | Q(condition2))

In this syntax, condition1 and condition2 represent the individual conditions you want to OR together. The | operator is used to combine these conditions into a single OR query.

Now, let's move on to some practical examples to illustrate how to use OR queries effectively.

Example - Retrieving objects matching any of multiple conditions

Suppose we have a Django model named Product, and we want to retrieve all products that have either a certain category or are priced below a specific value.

We can achieve this with the following OR query:

from django.db.models import Q from myapp.models import Product result = Product.objects.filter(Q(category='Electronics') | Q(price__lt=1000))

In this example, we use the filter() method of the Product model with the Q object to create an OR query. It retrieves all products with a category named 'Electronics' or a price less than 1000.

Combining OR queries with AND

You can also combine OR queries with other conditions using the Q object. Let's say we want to retrieve all products that are either in the category 'Clothing' or have a price below 500, but also have a rating above 4.

We can achieve this as follows:

from django.db.models import Q from myapp.models import Product result = Product.objects.filter( Q(category='Clothing') | Q(price__lt=500), rating__gt=4 )

In this example, we are combining an OR query for category and price with an AND condition for the rating. This will give us all products that meet either of the category or price conditions while also having a rating above 4.

Using OR queries with negation

You can also use the negation operator ~ to apply a NOT condition to an OR query. For instance, let's retrieve all products that are not in the 'Electronics' category or have a price greater than or equal to 1000:

from django.db.models import Q from myapp.models import Product result = Product.objects.filter(~Q(category='Electronics') | Q(price__gte=1000))

In this example, the ~ operator negates the 'Electronics' category condition, effectively fetching products that do not belong to that category or have a price greater than or equal to 1000.


Django ORM provides a powerful and expressive way to perform OR queries using the Q object. By leveraging the Q object's capabilities, you can construct complex queries with ease. OR queries allow you to retrieve data based on multiple conditions, giving you greater flexibility and control over database interactions.

In this article, we explored the syntax of OR queries using the Q object and demonstrated various examples of how to apply OR queries in different scenarios. Now, you have the tools to efficiently retrieve data from the database using OR conditions in Django ORM. 


Latest Articles

Latest from djangocentral

How to Use Subquery() in Django With Practical Examples

In the realm of web development, Django stands as a powerful and versatile framework for building robust applications. One of the key aspects of developing efficient and optimized web applications is handling database queries effectively. In this article…
Read more →

4 min read

DRF Serializer: Handling OrderedDict and Converting It to a Dictionary or JSON

In Django Rest Framework (DRF) tests, when you access, you might encounter an OrderedDict instead of a regular dictionary. This behavior is intentional and reflects the design of DRF's serialization process.Understanding the Problem The u…
Read more →

3 min read

Django Rest Framework CheetSheet: Mastering API Development

Django Rest Framework (DRF) is a powerful toolkit that makes building robust and scalable web APIs with Django a breeze. Whether you're a seasoned Django developer or a newcomer, having a comprehensive cheat sheet at your disposal can be a game-changer. …
Read more →

5 min read

How to Perform NOT Queries in Django ORM

In Django, performing NOT queries allows you to exclude certain records from the query results based on specific conditions. The NOT operator, represented by the tilde (~) when used in conjunction with the Django ORM's Q object, helps you construct compl…
Read more →

3 min read