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ónicopassword: contraseña hasheadafirst_nameylast_name: nombre y apellidosis_active: cuenta activais_staff: acceso al panel de administraciónis_superuser: todos los permisos sin restriccionesdate_joined: fecha de registrolast_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)

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
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.