Relaciones en Modelos de Django
Modelos
Un modelo es la única fuente definitiva de información sobre sus datos. Es contiene los campos y comportamientos esenciales de los datos que almacenan. Generalmente, cada modelo mapea a una sola tabla de bases de datos.
Lo básico:
-
Cada modelo es una clase Python que subclasea django.db.models.Model.
-
Cada atributo del modelo representa un campo de base de datos.
-
Con todo esto, Django te da un API de acceso a la base de datos;
Tipos de Campos en Django
En Django, los modelos utilizan campos para definir el tipo de datos que se almacenarán en la base de datos.
Campos de Texto
-
CharField: Texto de longitud fija o limitada.
-
TextField: Texto largo sin límite específico.
Campos Numéricos
-
IntegerField: Números enteros.
-
FloatField: Números decimales de punto flotante.
-
DecimalField: Números decimales con precisión fija (ideal para dinero).
Campos de Fecha y Hora
-
DateField: Solo fecha (YYYY-MM-DD).
-
TimeField: Solo hora (HH:MM:SS.
-
DateTimeField: Fecha y hora combinadas.
Campos Booleanos
-
BooleanField: Verdadero o Falso (True/False).
-
NullBooleanField (obsoleto en Django 3.1+): Puede ser verdadero, falso o nulo.
Campos Relacionales
-
ForeignKey: Relación Muchos a Uno.
-
OneToOneField: Relación Uno a Uno.
-
ManyToManyField: Relación Muchos a Muchos.
Campos de Archivos
-
FileField: Archivos en general.
-
ImageField: Archivos de imagen (requiere instalación de Pillow).
Otros campos útiles
-
EmailField: Dirección de correo electrónico.
-
URLField: URL (enlace web).
-
SlugField: Texto corto optimizado para URLs.
-
UUIDField: Identificador único (UUID).
-
JSONField: Guarda datos en formato JSON.
Opciones de Campos en Django
Opción | Descripción | Ejemplo |
max_length | Longitud máxima del texto. | nombre = models.CharField(max_length=50) |
blank | Permite dejar el campo vacío en formularios. | descripcion = models.TextField(blank=True) |
null | Permite valores nulos en la base de datos. | fecha = models.DateField(null=True) |
default | Valor por defecto si no se proporciona uno. | activo = models.BooleanField(default=True) |
choices | Lista de opciones predefinidas para elegir. | estado = models.CharField(choices=ESTADOS, max_length=10) |
unique | Asegura que el valor no se repita en la tabla. | email = models.EmailField(unique=True) |
verbose_name | Nombre legible para el campo (admin, formularios). | nombre = models.CharField(verbose_name="Nombre completo", max_length=50) |
help_text | Texto de ayuda para usuarios (admin, formularios). | nombre = models.CharField(help_text="Ingrese su nombre completo", max_length=50) |
editable | Si False, no aparece en formularios o admin. | creado = models.DateTimeField(editable=False) |
primary_key | Marca el campo como la clave primaria del modelo. | id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) |
auto_now | Guarda la fecha/hora actual cada vez que se guarda. | actualizado = models.DateTimeField(auto_now=True) |
auto_now_add | Guarda la fecha/hora solo al crear el objeto. | creado = models.DateTimeField(auto_now_add=True) |
Relaciones en Modelos de Django
En Django, las relaciones entre modelos permiten conectar distintas tablas de la base de datos de manera sencilla y lógica. Estas relaciones reflejan cómo los datos están vinculados entre sí en el mundo real.
Tipos de Relaciones en Django
OneToOneField (Relación Uno a Uno)
Un OneToOneField es un tipo de relación en Django donde una instancia de un modelo está asociada exactamente con una única instancia de otro modelo.
Ejemplo básico
from django.db import models
from django.contrib.auth.models import User
class Perfil(models.Model):
usuario = models.OneToOneField(User, on_delete=models.CASCADE)
biografia = models.TextField()
fecha_nacimiento = models.DateField()
ForeignKey (Relación Muchos a Uno)
En Django, un campo ForeignKey crea una relación muchos a uno entre dos modelos. Cada registro del modelo que contiene el ForeignKey puede referenciar un registro único de otro modelo.
Ejemplo básico
from django.db import models
class Autor(models.Model):
nombre = models.CharField(max_length=100)
class Libro(models.Model):
titulo = models.CharField(max_length=200)
autor = models.ForeignKey(Autor, on_delete=models.CASCADE)
ManyToManyField (Relación Muchos a Muchos)
ManyToManyField en Django se utiliza para crear una relación de muchos a muchos entre dos modelos. Esto significa que una instancia de un modelo puede estar relacionada con múltiples instancias de otro modelo, y viceversa.
Cuando defines un ManyToManyField, Django crea automáticamente una tabla intermedia en la base de datos para gestionar esas relaciones múltiples de forma eficiente.
Ejemplo básico
from django.db import models
class Estudiante(models.Model):
nombre = models.CharField(max_length=100)
class Curso(models.Model):
nombre = models.CharField(max_length=100)
estudiantes = models.ManyToManyField(Estudiante)