Menos consultas
Parte de la sección Modelos y el panel de administración del Journey de Django de Coddy. Lección 19 de 23.
La página de inicio muestra el autor de cada libro, y eso tiene un costo: una consulta obtiene los libros; después, {{ book.author.name }} ejecuta una consulta más por cada libro. Diez libros, once consultas; mil libros, mil una. Este es el problema N+1, una razón común por la que una página de Django es lenta.
select_related() lo soluciona: el ORM obtiene la fila relacionada en la misma consulta, con un JOIN de SQL. Una página de préstamos que muestra el título del libro de cada préstamo requeriría:
loans = Loan.objects.select_related("book")Le das el nombre del campo ForeignKey, el que lees como loan.book, y sigue encadenándose con filter() y order_by(). Solo sigue las ForeignKeys hacia delante; para el camino de vuelta y los campos de muchos a muchos se usa prefetch_related(), que viste en el proyecto Authors. Después, la página se ve igual, con menos consultas.
Desafío
IntermedioTanto la página de inicio como la página de búsqueda muestran el autor de cada libro. Haz que ambas obtengan los autores junto con los libros, para que el número de consultas se mantenga igual independientemente de cuántos libros haya:
- la vista
home - la vista
search
Pulsa Run: las páginas se ven iguales. Las comprobaciones cuentan las consultas.
Pruébalo tú mismo
from django.shortcuts import get_object_or_404, render
from .models import Book
def home(request):
books = Book.objects.all()
return render(request, "books/home.html", {"books": books})
def book_detail(request, pk):
book = get_object_or_404(Book, pk=pk)
return render(request, "books/book_detail.html", {"book": book})
def search(request):
q = request.GET.get("q", "")
books = Book.objects.filter(title__icontains=q)
return render(request, "books/search.html", {"q": q, "books": books})
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Modelos y el panel de administración
3Páginas desde la base de datos
Una lista desde la base de datosUna página para cada libroPractica por tu cuenta: Playground de Django