Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Learn Q and F Objects | Complex Queries
Django ORM Ninja: Advanced Techniques for Developers

book
Q and F Objects

Django ORM extends its querying capabilities with more advanced features like F expressions and Q objects.

F Expressions

F expressions are used to refer to model field values directly in queries, enabling operations like comparisons and arithmetic directly in the database.

Example 1:

Updating the number of pages in all books by a certain percentage:

python
from django.db.models import F

Book.objects.update(pages=F("pages") * 1.1)

SQL-related query: (UPDATE Book SET pages = pages * 1.1;) This increases the page count of every book by 10%.

Example 2:

Suppose you want to identify books whose prices are significantly higher than the average price of books in their respective genres. You can use F expressions with comparisons to achieve this:

python
# First, annotate each book with the average price of its genre
genre_avg = Book.objects.annotate(
genre_avg_price=Avg("philosophy__book__price")
)


# Then, filter books where the price is more than 50% higher than the genre's average
expensive_books = genre_avg.filter(price__gt=F("genre_avg_price") * 1.5

Q Objects

Q objects are used for complex query conditions, allowing the use of logical operators like AND/OR.

Example 1:

Finding books by a certain author OR in a certain genre:

python
from django.db.models import Q

books = Book.objects.filter(
Q(author__name="J.K. Rowling") | Q(genre__name="Fantasy")
)

This retrieves books either written by "J.K. Rowling" or in the "Fantasy" genre.

Example 2:

To find books that are not in the "fantasy" genre and have more than 300 pages, you can combine ~Q with an AND condition:

python
from django.db.models import Q

books = Book.objects.filter(
~Q(genre__name="fantasy") & Q(pages__gt=300)
)

Note

The ~Q and ~F operators can be used to negate a query condition. For example, ~Q(author__name="J.K. Rowling") query fetches all books where the author is not "J.K. Rowling".

1. What is the purpose of F expressions in Django ORM?

2. How can you increase the page count of every book in the database by 10% using Django ORM?

3. What are Q objects used for in Django ORM?

question mark

What is the purpose of F expressions in Django ORM?

Select the correct answer

question mark

How can you increase the page count of every book in the database by 10% using Django ORM?

Select the correct answer

question mark

What are Q objects used for in Django ORM?

Select the correct answer

Everything was clear?

How can we improve it?

Thanks for your feedback!

Section 5. Chapter 2
We use cookies to make your experience better!
some-alt