Django: Django ORM
Descubre cómo usar el ORM de Django para gestionar bases de datos con objetos Python de forma segura y eficiente. Aprende modelos, consultas y relaciones.
Aprende Django GRATIS y certifícateDjango ORM
El Object-Relational Mapping (ORM) de Django constituye una de las características más distintivas del framework, proporcionando una interfaz Python elegante para interactuar con bases de datos relacionales. En lugar de escribir consultas SQL directamente, el ORM permite trabajar con objetos Python que representan tablas y registros de la base de datos.
¿Qué es un ORM?
Un ORM actúa como una capa de abstracción entre el código Python y la base de datos. Esta abstracción traduce automáticamente las operaciones realizadas sobre objetos Python en consultas SQL correspondientes, y viceversa.
El ORM de Django ofrece ventajas significativas:
- Independencia de la base de datos: El mismo código funciona con PostgreSQL, MySQL, SQLite u otros motores
- Seguridad integrada: Protección automática contra inyecciones SQL
- Sintaxis pythónica: Operaciones de base de datos expresadas como métodos de objetos Python
- Validación automática: Verificación de tipos y restricciones antes de guardar datos
Modelos: La base del ORM
Los modelos en Django son clases Python que heredan de django.db.models.Model
. Cada modelo representa una tabla en la base de datos, mientras que cada atributo del modelo corresponde a un campo de esa tabla.
from django.db import models
class Producto(models.Model):
nombre = models.CharField(max_length=100)
precio = models.DecimalField(max_digits=10, decimal_places=2)
descripcion = models.TextField()
fecha_creacion = models.DateTimeField(auto_now_add=True)
activo = models.BooleanField(default=True)
En este ejemplo, Django creará automáticamente una tabla llamada app_producto
(donde app
es el nombre de tu aplicación) con los campos correspondientes.
Tipos de campos principales
Django proporciona diversos tipos de campos para modelar diferentes tipos de datos:
- CharField: Texto con longitud limitada
- TextField: Texto largo sin límite específico
- IntegerField: Números enteros
- DecimalField: Números decimales con precisión específica
- BooleanField: Valores verdadero/falso
- DateTimeField: Fechas y horas
- EmailField: Direcciones de correo electrónico con validación
class Usuario(models.Model):
username = models.CharField(max_length=50, unique=True)
email = models.EmailField()
edad = models.IntegerField()
fecha_registro = models.DateTimeField(auto_now_add=True)
es_premium = models.BooleanField(default=False)
Operaciones básicas con el ORM
Crear registros
Para crear nuevos registros, puedes instanciar el modelo y llamar al método save()
:
# Crear un nuevo producto
producto = Producto(
nombre="Laptop Gaming",
precio=1299.99,
descripcion="Laptop para gaming de alta gama"
)
producto.save()
# Alternativa usando create()
producto = Producto.objects.create(
nombre="Mouse Inalámbrico",
precio=29.99,
descripcion="Mouse ergonómico inalámbrico"
)
Consultar registros
El QuerySet es el mecanismo principal para realizar consultas. Los QuerySets son perezosos, lo que significa que no ejecutan la consulta hasta que realmente necesitas los datos:
# Obtener todos los productos
productos = Producto.objects.all()
# Obtener un producto específico
producto = Producto.objects.get(id=1)
# Filtrar productos
productos_caros = Producto.objects.filter(precio__gt=100)
productos_activos = Producto.objects.filter(activo=True)
# Combinar filtros
productos_premium = Producto.objects.filter(
precio__gt=500,
activo=True
)
Actualizar registros
Para actualizar registros existentes, modifica los atributos del objeto y guarda los cambios:
# Actualizar un producto específico
producto = Producto.objects.get(id=1)
producto.precio = 1199.99
producto.save()
# Actualización masiva
Producto.objects.filter(activo=False).update(precio=0)
Eliminar registros
La eliminación de registros se puede realizar sobre objetos individuales o conjuntos de registros:
# Eliminar un producto específico
producto = Producto.objects.get(id=1)
producto.delete()
# Eliminación masiva
Producto.objects.filter(precio=0).delete()
Lookups: Consultas avanzadas
Los lookups permiten realizar consultas más sofisticadas utilizando una sintaxis especial con doble guión bajo:
# Productos con precio mayor a 100
Producto.objects.filter(precio__gt=100)
# Productos cuyo nombre contiene "gaming"
Producto.objects.filter(nombre__icontains="gaming")
# Productos creados en el último mes
from datetime import datetime, timedelta
fecha_limite = datetime.now() - timedelta(days=30)
Producto.objects.filter(fecha_creacion__gte=fecha_limite)
# Productos con precios en un rango específico
Producto.objects.filter(precio__range=(50, 200))
Relaciones entre modelos
Django facilita la definición de relaciones entre modelos mediante campos especiales:
class Categoria(models.Model):
nombre = models.CharField(max_length=50)
descripcion = models.TextField()
class Producto(models.Model):
nombre = models.CharField(max_length=100)
precio = models.DecimalField(max_digits=10, decimal_places=2)
categoria = models.ForeignKey(Categoria, on_delete=models.CASCADE)
Esta relación ForeignKey establece que cada producto pertenece a una categoría, mientras que una categoría puede tener múltiples productos.
# Crear una categoría y productos relacionados
categoria = Categoria.objects.create(
nombre="Electrónicos",
descripcion="Dispositivos electrónicos"
)
producto = Producto.objects.create(
nombre="Smartphone",
precio=699.99,
categoria=categoria
)
# Acceder a la relación
print(producto.categoria.nombre) # "Electrónicos"
# Consultar productos de una categoría
productos_electronicos = Producto.objects.filter(categoria__nombre="Electrónicos")
El ORM de Django transforma estas operaciones en consultas SQL optimizadas, manejando automáticamente las complejidades de las bases de datos relacionales mientras mantiene un código Python limpio y expresivo.
Lecciones de este módulo de Django
Lecciones de programación del módulo Django ORM del curso de Django.