Contenido del Curso
Django ORM Ninja: Técnicas Avanzadas para Desarrolladores
Django ORM Ninja: Técnicas Avanzadas para Desarrolladores
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:
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:
# 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:
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:
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?
¡Gracias por tus comentarios!