[pyar] [Django] User Profile vs User Inheritance

Ariel Camino arielcamino en gmail.com
Lun Ene 23 01:31:29 ART 2012


El 21/01/12 14:25, Daniel Moisset escribió:
> 2012/1/21 Ariel Camino <arielcamino en gmail.com>:
>> Hola gente, tengo una consulta relacionada con el diseño de una aplicación.
>>
>> Tengo dos tipos de usuarios, que deben tener atributos diferentes,
>> comportamientos diferentes, y se relacionan con elementos diferentes. Un
>> usuario de un tipo, nunca es al mismo tiempo usuario del "otro tipo", es
>> decir son como dos roles completamente diferentes.
>>
>> (...)
>>
>> Buscando un poco me encontré con esta página que explica como hacerlo
>> heredando de User:
>>
>> http://scottbarnham.com/blog/2008/08/21/extending-the-django-user-model-with-inheritance/
>>
> 
> Yo he visto varias veces gente intentando usar el esquema ese que se
> propone ahi, y tiende a ser problematico. Si bien tocar el
> authentication backend para que fabrique otro tipo de objeto parece
> resolver el problema de "el framework me devuelve un User() y no un
> MiUsuarioLoco()", en realidad el problema de estar instanciando la
> clase que no crresponde te va a aparecer en un monton de lados, en
> particular en cada aplicacion de terceros que de algun modo se vincule
> con el modelo User. Los problemas tipicos que he visto son funciones
> donde al final no sabes si estas recibiendo una instancia del user de
> django o de tu usuario customizado. Y ademas que otras apps que
> reciben el usuario customizado a veces se van a romper a menos que tu
> clase se cuide muy bien de poder sustituir a un
> django.contrib.auth.User().
> 
> Lo que yo te sugiero es seguir el esquema que sale en la documentación
> de django... y si queres, podes hacer dos modelos que hereden de tu
> clase UserProfile, con lo cual tenes lo mejor de ambos mundos.
> 
> Saludos,
>    D.

Daniel, te cuento que seguí tu consejo, y la verdad no estoy para nada
conforme con la solución.

Tengo dos problemas, que podes ver también en este sitio:

http://www.quora.com/Whats-the-best-practice-for-following-multiple-authentication-backends-in-Django

el primero, es que en settings solo puedo definir un solo tipo de clase
asociada al perfil del usuario, así que al dejar la clase padre
(UserProfile):
AUTH_PROFILE_MODULE = 'accounts.UserProfile'

al hacer un user.get_profile() me devuelve la instancia de la clase
padre, y tengo que estar preguntando si es de un tipo o del otro, algo
que me parece bastante feo, para obtener el resto del perfil.

El segundo es que no puedo usar el Signal de creación de User, porque es
complicado saber en ese momento "de que tipo va a ser" para crear el
perfil asociado, debería utilizar algún atributo adicional como
is_staff, o en base al nombre del usuario, esto igual no es tan grave.

La mala noticia es que hay un ticket creado para agregar soporte para
múltiples perfiles, en donde afirman que no lo van a solucionar
temporalmente para mantener la compatibilidad hacia atras:
https://code.djangoproject.com/ticket/2373

Voy a probar creando dos clases que hereden de User, y definiendo ambas
autenticaciones (django prueba primero con una, y luego con la otra). Me
parece que es lo más sencillo desde el punto de vista del diseño del
modelo de la aplicación, y espero que no me traiga problemas a futuro.

Seguiré reportando como me fue, gracias igual por la idea.

Saludos!
-- 
Ariel Camino



More information about the pyar mailing list