Extender django User model.

Necesitaba traducir este articulo por que es demasiado bueno, un vistazo muy rápido a django.auth  y su modelo usuario. Respondiendo una gran pregunta:  ¿por que en un lenguaje de “debería haber una única forma de hacerlo” tiene tantas opciones? Simple is better blog > django user models

El sistema de autenticacion de django es muy bueno out-of-the-box. Es eficiente en la mayoría de los casos y muy sencillo de usar. Pero algunas veces necesitamos ajustar un poco ese modelo.

Normalmente necesitamos agregar mas atributos al usuario si tenemos un aspecto “social” en nuestra web. Queremos guardar una pequeña bio, o una imagen para el usuario.

Tenemos varias estrategias para extender el User model  de django, para no tener que re implementar todo desde cero.


Formas de Extender  User Model

Hay 4 formas diferentes de extender el usuario, lo difícil es saber cual usar y cuando.

Opción 1: Usando un Proxy Model.

¿Que es un proxy model?

Es un modelo heredado que no crea una nueva tabla en la base de datos.

¿Cuando usamos proxy model?

Usamos este método cuando necesitamos extender el usuario sin agregar nuevos datos de información. Esta opción es sencilla para agregar nuevos métodos a nuestro objeto sin cambiar sus atributos

En el ejemplo solo modificamos la ordenación por default y agregamos un método propio.

Opción 2: Relación One-to-one a modelo usuario.

Es un modelo regular de django auth que se relaciona a otra tabla de 1 a 1.

¿Que es un one-to-one link?

es una relación a nivel de base de datos que mantiene la consistencia. a cada fila de nuestra nueva tabla le corresponde una sola fila de la tabla usuarios.

¿Cuando usamos one-to-one?

Cuando necesitamos guardar información adicional sobre el usuario que no esta relacionada con el proceso de autenticacion. Normalmente llamamos a este modelo User_profile.

En este ejemplo creamos el modelo perfil, y agregamos las señales correspondientes para que se cree el modelo perfil.

Opción 3: Creando un User model extendiendo de AbstractBaseUser.

Esta opción aparece en años recientes causando mucha confusión a la antigua y casi única forma de extender User  mediante un  modelo User_profile.

¿Que es AbstracBaseUser?

Es una entidad nueva de usuario heredada de AbstractBaseUser. Necesita algunas modificaciones al settings.py. Tiene un impacto dramático a la base de datos, por lo que es preferible implementar al principio.

¿Cuando usamos AbstractBaseUser?

Cuando nuestra aplicación necesita modificar el proceso de autenticacion. Por ejemplo cuando queremos usar el email de usuario en lugar de un username.

En este ejemplo lo importante es resalta  USERNAME_FIELD=’email’  y el atributo correspondiente en email de unique=True. Esto permite que la autenticacion de django siga funcionando adecuadamente.

El tutorial explica un poco también la modificación realizada a BaseUserManager, que no es indispensable y por lo tanto no traduciré.

El ultimo paso es la correspondiente modificación de settings.py añadiendo AUTH_USER_MODEL = ‘tuapp.User’

Opción 4: Creando un User model extendiendo de AbstractUser

AbstractUser aparece en el escenario a la par de la opción anterior, rompiendo con la mítica regla de “debería haber una y solo una forma obvia de hacer las cosas”.

¿Que es AbstractUser?

Es una entidad nueva de usuario heredada de AbstractUser. Necesita algunas modificaciones al settings.py. Tiene un impacto dramático a la base de datos, por lo que es preferible implementar al principio.

¿Cuando usamos AbstractUser?

Este es el mismo modelo de django auth, el proceso de autentificacion no cambia necesariamente. Con esta opción podemos agregar nueva información al usuario sin recurrir a una  clase extra como en la opción 2.

Esta es una opción mas limpia que la forma one-to-one  pero requiere hacerse desde el principio del proyecto o atenerse al posible dolor de cabeza que es migrar el usuario.

El ultimo paso es la correspondiente modificación de settings.py añadiendo AUTH_USER_MODEL = ‘tuapp.User’

Martin Quinta

Crecí con una computadora desde el kinder. Empece a programar a los 14 y hoy, mas de una década después… realmente odio estar frente a una computadora. Pero programar es en lo que soy bueno, por lo tanto me desahogo en este blog mientras bebo cerveza artesanal y pienso en un mundo bonito donde Java no existe.

Facebook Twitter LinkedIn  

Entradas relacionadas:

Leave a Reply

Your email address will not be published. Required fields are marked *