Consulta de Datos¶
1. Introducción¶
Las consultas de datos son fundamentales en cualquier aplicación que interactúe con bases de datos. Nos permiten recuperar información almacenada en tablas y trabajar con ella de manera dinámica. En el contexto de Django, las consultas se realizan a través de su ORM (Object-Relational Mapping), lo que nos permite interactuar con la base de datos usando objetos de Python en lugar de escribir consultas SQL directamente.
A continuación, mostraremos algunos ejemplos de consultas SQL para ilustrar cómo Django genera estas consultas mediante su ORM.
Ejemplos de consultas SQL¶
-
Obtener todos los autores:
SELECT * FROM authors; -
Filtrar autores por correo electrónico:
SELECT * FROM authors WHERE email = 'email@example.com'; -
Obtener un autor específico por su id:
SELECT * FROM authors WHERE id = 1; -
Obtener los primeros 10 autores:
SELECT * FROM authors LIMIT 10; -
Ordenar autores por nombre:
SELECT * FROM authors ORDER BY name;
2. Crear una Ruta para Consultas en urls.py de la App post¶
Comenzaremos creando una ruta para realizar las consultas de datos en nuestra aplicación posts. En urls.py de la app posts, añadimos la ruta /queries/ que apunta a la vista que gestionará las consultas.
# posts/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('queries/', views.queries, name='queries'),
]
3. Definir el Controlador en views.py¶
Ahora definimos la función queries en views.py que será la encargada de manejar la ruta /queries/. De momento, solo devolveremos un HttpResponse para verificar que la ruta funciona correctamente.
# posts/views.py
from django.http import HttpResponse
def queries(request):
return HttpResponse('Ruta de consultas funcionando!')
Imagen navegador

4. Crear la Carpeta templates y el Archivo queries.html¶
A continuación, crearemos la carpeta templates dentro de la app posts y dentro de ella el archivo queries.html. Esto nos permitirá renderizar una plantilla HTML para mostrar los resultados de las consultas.
# Crear la carpeta templates en la app posts
mkdir posts/templates
# Crear el archivo queries.html
touch posts/templates/queries.html
En queries.html, comenzamos con una estructura básica de HTML5.
<!-- posts/templates/queries.html -->
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Consultas de Datos</title>
</head>
<body>
<h1>Consultas de Datos</h1>
</body>
</html>
5. Modificar la Vista para Utilizar los Modelos Author y Post¶
Importamos los modelos Author y Post en views.py para trabajar con ellos y realizar consultas sobre estos modelos. Luego, modificamos la vista queries para renderizar la plantilla queries.html y pasamos un contexto vacío.
# posts/views.py
from django.shortcuts import render
from posts.models import Author, Post
def queries(request):
# Aquí vamos a ir agregando los resultados de nuestras consultas
context = {}
return render(request, 'queries.html', context)
6. Primer Ejemplo: Obtener Todos los Autores¶
En este primer ejemplo, vamos a obtener todos los autores de la base de datos utilizando el método all(). Luego, pasamos los resultados al contexto para mostrarlos en la plantilla queries.html.
from .models import Author
# posts/views.py
def queries(request):
authors = Author.objects.all() # Obtiene todos los autores
context = {'authors': authors}
return render(request, 'queries.html', context)
En queries.html, mostramos los autores con un bucle for en una lista desordenada <ul>:
<!-- posts/templates/queries.html -->
<ul>
{% for author in authors %}
<li>{{ author.name }} ({{ author.email }})</li>
{% endfor %}
</ul>
<p>Total de autores: {{ authors|length }}</p>
Consulta SQL equivalente:
SELECT * FROM authors;
7. Segundo Ejemplo: Filtrar los Autores¶
En este caso, vamos a filtrar los autores por correo electrónico. Usamos el método filter() para obtener solo el autor cuyo correo electrónico coincide con el valor que proporcionemos. Por ejemplo, filtramos por el correo email@example.com.
# posts/views.py
def queries(request):
authors = Author.objects.filter(email='email@example.com') # Filtra por correo
context = {'authors': authors}
return render(request, 'queries.html', context)
8. Filtrar por Clave, Obtener Solo un Autor¶
Ahora, vamos a obtener solo un autor específico utilizando el método get(). Este método devuelve un solo objeto basado en los criterios especificados. Por ejemplo, buscamos al autor con id=1.
# posts/views.py
def queries(request):
author = Author.objects.get(id=1) # Obtiene un autor por su id
context = {'author': author}
return render(request, 'queries.html', context)
En queries.html, mostramos el nombre del autor en un <h2>:
<!-- posts/templates/queries.html -->
<h2>{{ author.name }}</h2>
9. Consultar con Límites: Los Primeros 10 Autores¶
Ahora vamos a repetir la consulta para obtener los primeros 10 autores. Utilizamos el método [:10] para limitar los resultados a los primeros 10.
# posts/views.py
def queries(request):
authors = Author.objects.all()[:10] # Obtiene los primeros 10 autores
context = {'authors': authors}
return render(request, 'queries.html', context)
10. Consultar con Offset: Desde el Autor 10 hasta el 20¶
Ahora realizamos una consulta con un offset. Obtenemos autores desde el décimo hasta el vigésimo.
# posts/views.py
def queries(request):
authors = Author.objects.all()[10:20] # Obtiene autores del 10 al 20
context = {'authors': authors}
return render(request, 'queries.html', context)
11. Ordenar los Resultados¶
Usamos el método order_by() para ordenar los autores por su nombre.
# posts/views.py
def queries(request):
authors = Author.objects.all().order_by('name') # Ordena por nombre
context = {'authors': authors}
return render(request, 'queries.html', context)
12. Filtros Avanzados¶
Django ORM permite realizar consultas con filtros más complejos, usando operadores como >, <, >=, <=, != y otros. Aquí hay algunos ejemplos de cómo utilizar estos filtros.
Ejemplo de Filtro con Comparadores¶
Filtramos los autores cuyo id esté entre 5 y 15.
# posts/views.py
def queries(request):
authors = Author.objects.filter(id__gte=5, id__lte=15) # Filtra por id entre 5 y 15
context = {'authors': authors}
return render(request, 'queries.html', context)
Consulta SQL equivalente:
SELECT * FROM authors WHERE id >= 5 AND id <= 15;
Ejemplo con Operadores de Texto¶
Filtramos los autores cuyo nombre contiene la palabra "Juan".
# posts/views.py
def queries(request):
authors = Author.objects.filter(name__icontains='Juan') # Filtra nombres que contienen 'Juan'
context = {'authors': authors}
return render(request, 'queries.html', context)
13. Resumen¶
En este tema, hemos aprendido a realizar consultas de datos en Django utilizando su ORM. Vimos cómo obtener todos los objetos, filtrarlos por diferentes criterios, ordenarlos, y trabajar con operadores avanzados como comparadores y operadores de texto. Además, aprendimos a mostrar estos resultados en una plantilla HTML utilizando el contexto.