Modelo User y modelo personalizado

Intermedio
Django
Django
Actualizado: 18/04/2026

El modelo User de Django

Django incluye un modelo User completo en django.contrib.auth.models con los siguientes campos principales:

  • username: nombre de usuario único (requerido)
  • email: correo electrónico
  • password: contraseña hasheada
  • first_name y last_name: nombre y apellidos
  • is_active: cuenta activa
  • is_staff: acceso al panel de administración
  • is_superuser: todos los permisos sin restricciones
  • date_joined: fecha de registro
  • last_login: último inicio de sesión
from django.contrib.auth.models import User

# Crear usuario (siempre usar create_user, nunca User(password=...))
usuario = User.objects.create_user(
    username='ana_garcia',
    email='ana@ejemplo.com',
    password='contraseña_segura_123'
)

# Crear superusuario
superusuario = User.objects.create_superuser(
    username='admin',
    email='admin@ejemplo.com',
    password='admin_seguro_456'
)

# Buscar usuarios
usuario = User.objects.get(username='ana_garcia')
usuarios_activos = User.objects.filter(is_active=True)

Diagrama conceptual de Modelo User y modelo personalizado

Extender con AbstractUser

La forma más sencilla de añadir campos al modelo de usuario es extender AbstractUser. Importante: definir el modelo personalizado desde el inicio del proyecto; cambiarlo después requiere migraciones complejas.

# usuarios/models.py
from django.contrib.auth.models import AbstractUser
from django.db import models

class Usuario(AbstractUser):
    """Modelo de usuario extendido con campos adicionales."""
    bio = models.TextField(blank=True, max_length=500)
    avatar = models.ImageField(upload_to='avatares/', blank=True, null=True)
    telefono = models.CharField(max_length=15, blank=True)
    fecha_nacimiento = models.DateField(null=True, blank=True)
    ciudad = models.CharField(max_length=100, blank=True)
    acepto_terminos = models.BooleanField(default=False)

    class Meta:
        verbose_name = 'Usuario'
        verbose_name_plural = 'Usuarios'

    def get_nombre_completo(self):
        return self.get_full_name() or self.username

    def __str__(self):
        return self.username
# settings.py
AUTH_USER_MODEL = 'usuarios.Usuario'

Con AUTH_USER_MODEL configurado, todas las referencias al modelo de usuario (como request.user) apuntan al modelo personalizado.

Registrar el modelo en admin

# usuarios/admin.py
from django.contrib import admin
from django.contrib.auth.admin import UserAdmin
from .models import Usuario

@admin.register(Usuario)
class UsuarioAdmin(UserAdmin):
    # Añadir campos personalizados al panel de administración
    fieldsets = UserAdmin.fieldsets + (
        ('Información adicional', {
            'fields': ('bio', 'avatar', 'telefono', 'fecha_nacimiento', 'ciudad')
        }),
    )
    add_fieldsets = UserAdmin.add_fieldsets + (
        ('Información adicional', {
            'fields': ('email', 'bio', 'telefono')
        }),
    )

AbstractBaseUser para modelos completamente personalizados

Cuando el modelo de usuario debe ser radicalmente diferente (por ejemplo, usando email en lugar de username), extiende AbstractBaseUser:

from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin

class UsuarioManager(BaseUserManager):
    def create_user(self, email, password=None, **extra_fields):
        if not email:
            raise ValueError('El email es obligatorio.')
        email = self.normalize_email(email)
        usuario = self.model(email=email, **extra_fields)
        usuario.set_password(password)
        usuario.save(using=self._db)
        return usuario

    def create_superuser(self, email, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        return self.create_user(email, password, **extra_fields)

class UsuarioConEmail(AbstractBaseUser, PermissionsMixin):
    """Modelo de usuario que usa email como identificador."""
    email = models.EmailField(unique=True)
    nombre = models.CharField(max_length=100)
    apellidos = models.CharField(max_length=100, blank=True)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    date_joined = models.DateTimeField(auto_now_add=True)

    objects = UsuarioManager()

    USERNAME_FIELD = 'email'          # Campo usado para el login
    REQUIRED_FIELDS = ['nombre']      # Requeridos en createsuperuser

    class Meta:
        verbose_name = 'Usuario'
        verbose_name_plural = 'Usuarios'

    def __str__(self):
        return self.email

Referencia al modelo de usuario desde otras apps

Para referencias a AUTH_USER_MODEL en ForeignKey desde otras aplicaciones, usa settings.AUTH_USER_MODEL en lugar de importar directamente:

from django.conf import settings
from django.db import models

class Pedido(models.Model):
    # Correcto: funciona independientemente del modelo de usuario configurado
    usuario = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name='pedidos'
    )

En el código de las vistas y signals, usa get_user_model() para obtener la clase del modelo activo:

from django.contrib.auth import get_user_model
User = get_user_model()
usuario = User.objects.get(pk=1)

Configurar el modelo de usuario correctamente desde el inicio del proyecto es una de las decisiones más importantes en Django, ya que cambiarlo después requiere resetear y regenerar todas las migraciones.

Alan Sastre - Autor del tutorial

Alan Sastre

Ingeniero de Software y formador, CEO en CertiDevs

Ingeniero de software especializado en Full Stack y en Inteligencia Artificial. Como CEO de CertiDevs, Django es una de sus áreas de expertise. Con más de 15 años programando, 6K seguidores en LinkedIn y experiencia como formador, Alan se dedica a crear contenido educativo de calidad para desarrolladores de todos los niveles.

Más tutoriales de Django

Explora más contenido relacionado con Django y continúa aprendiendo con nuestros tutoriales gratuitos.

Aprendizajes de esta lección

Entender la estructura del modelo User integrado de Django. Extender el modelo User con AbstractUser para añadir campos adicionales. Crear un modelo de usuario completamente personalizado con AbstractBaseUser. Configurar AUTH_USER_MODEL en settings.py para usar el modelo personalizado. Crear usuarios con create_user() y create_superuser() de forma correcta.