Para mi aplicación, se debe requerir el campo de correo electrónico de un Usuario. Ese no es el caso para el modelo de usuario predeterminado. Así que pensé que tendría sentido crear un modelo de usuario personalizado como se describe en los documentos :
Si está comenzando un nuevo proyecto, se recomienda configurar un modelo de usuario personalizado, incluso si el modelo de usuario predeterminado es suficiente para usted. Este modelo se comporta de manera idéntica al modelo de usuario predeterminado, pero podrá personalizarlo en el futuro si surge la necesidad:
from django.contrib.auth.models import AbstractUser class User(AbstractUser): email = models.EmailField(_('email address'), blank=False)Sin embargo, no estoy seguro de si esa es la forma correcta de lograr esto.
La razón es que aquí los documentos de Django dicen:
Las clases base abstractas son útiles cuando desea poner información común en una serie de otros modelos. Escribes tu clase base y pones abstract=True en la clase Meta. Este modelo no se utilizará para crear ninguna tabla de base de datos. En cambio, cuando se usa como clase base para otros modelos, sus campos se agregarán a los de la clase secundaria. Es un error tener campos en la clase base abstracta con el mismo nombre que los del elemento secundario (y Django generará una excepción).
¿Qué debería hacer ahora?
Tengo que responder a mi pregunta porque ahora sé la solución:
La forma en que describí en la publicación de inicio debería funcionar. Los documentos están mal: https://code.djangoproject.com/ticket/29192
agregar en models.py
from django.contrib.auth.models import User User._meta.get_field('email')._unique = True User._meta.get_field('email').blank = False User._meta.get_field('email').null = FalseEditar: debe subclasificar AbstractBaseUser e implementar todos los demás atributos también.
from django.contrib.auth.models import AbstractBaseUser, UserManager class User(AbstractBaseUser): email = models.EmailField(_('email address'), blank=False) objects = UserManager()Segunda edición:
La respuesta de Aliquis es la correcta . La documentación actual es simplemente incorrecta : "Es un error tener campos en la clase base abstracta con el mismo nombre que los del elemento secundario (y Django generará una excepción)".