En el desarrollo de aplicaciones Django, los modelos rara vez existen de forma aislada.
Las relaciones entre modelos son fundamentales para crear estructuras de datos complejas y significativas.
Django ofrece tres tipos principales de relaciones: One-to-Many, Many-to-Many, y One-to-One.
One-to-Many (Uno a Muchos)La relación más común en bases de datos, implementada usando ForeignKey.
Ejemplo: Sistema de Biblioteca
from django.db import models
class Autor(models.Model):
nombre = models.CharField(max_length=200)
nacionalidad = models.CharField(max_length=100)
def __str__(self):
return self.nombre
class Libro(models.Model):
titulo = models.CharField(max_length=300)
fecha_publicacion = models.DateField()
autor = models.ForeignKey(
Autor,
on_delete=models.CASCADE,
related_name='libros'
)
def __str__(self):
return self.titulo # Obtener todos los libros de un autor
autor = Autor.objects.get(nombre="Gabriel García Márquez")
libros_del_autor = autor.libros.all()
# Obtener el autor de un libro
libro = Libro.objects.get(titulo="Cien Años de Soledad")
autor_del_libro = libro.autor Many-to-Many (Muchos a Muchos)Perfecta para relaciones complejas donde múltiples objetos se relacionan entre sí.
Ejemplo: Sistema de Cursos y Estudiantes
class Estudiante(models.Model):
nombre = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.nombre
class Curso(models.Model):
nombre = models.CharField(max_length=200)
estudiantes = models.ManyToManyField(
Estudiante,
related_name='cursos'
)
def __str__(self):
return self.nombre # Agregar un estudiante a un curso
curso_python = Curso.objects.get(nombre="Curso de Python")
estudiante_juan = Estudiante.objects.get(nombre="Juan")
curso_python.estudiantes.add(estudiante_juan)
# Obtener cursos de un estudiante
cursos_de_juan = estudiante_juan.cursos.all()
# Obtener estudiantes de un curso
estudiantes_en_python = curso_python.estudiantes.all() One-to-One (Uno a Uno)Útil cuando se necesita una extensión de perfil o información adicional.
Ejemplo: Perfil de Usuario
from django.contrib.auth.models import User
class PerfilUsuario(models.Model):
usuario = models.OneToOneField(
User,
on_delete=models.CASCADE,
primary_key=True
)
telefono = models.CharField(max_length=15, blank=True)
direccion = models.TextField(blank=True)
fecha_nacimiento = models.DateField(null=True)
def __str__(self):
return f"Perfil de {self.usuario.username}" # Acceder al perfil desde un usuario
usuario = User.objects.get(username="juanperez")
perfil = usuario.perfilusuario
# Crear un perfil para un usuario
nuevo_usuario = User.objects.create_user(username="mariagomez")
perfil_maria = PerfilUsuario.objects.create(
usuario=nuevo_usuario,
telefono="555-1234"
) related_nameCASCADE: Elimina objetos relacionadosSET_NULL: Establece como nulo (requiere null=True)PROTECT: Previene eliminación de objetos relacionadosLa selección anticipada mejora el rendimiento de las consultas al reducir las consultas adicionales a la base de datos.
Aquí usamos prefetch_related para optimizar la carga de estudiantes relacionados con cursos.
# Optimizar consultas con select_related y prefetch_related
cursos_con_estudiantes = Curso.objects.prefetch_related('estudiantes') related_name para claridadon_deleteselect_related y prefetch_relatedLas relaciones en modelos Django son poderosas y flexibles. Comprender los diferentes tipos de relaciones y sus matices te permitirá diseñar esquemas de datos robustos y eficientes.