loginview - Extender el objeto de usuario en Django: ¿la herencia del modelo de usuario o usar el perfil de usuario?
django user model (2)
Para extender el objeto Usuario con campos personalizados, la documentación de Django recomienda usar UserProfiles usuario. Sin embargo, de acuerdo con this respuesta a una pregunta sobre esto desde hace aproximadamente un año:
La extensión de django.contrib.auth.models.User también funciona mejor ahora, desde la refactorización del código de herencia de Django en los modelos API.
Y artículos como this muestran cómo extender el modelo de usuario con campos personalizados, junto con las ventajas (recuperar propiedades directamente del objeto de usuario, en lugar de hacerlo a través del archivo .get_profile ()).
Así que me preguntaba si hay algún consenso sobre este tema, o razones para usar uno u otro. ¿O incluso lo que piensa el equipo de Django actualmente?
Esto es lo que dice James Bennett en esta entrada de blog sobre la herencia de modelos :
Apostaría a que probablemente el 90% o más de las cosas que las personas dicen que quieren hacer con las subclases podrían lograrse mejor definiendo un modelo relacionado y vinculándolo con una clave externa única.
Así que creo que la mejor manera de hacerlo es utilizar una aplicación externa, como algunos componentes de Pinax , o la aplicación de django-profiles (originalmente del mismo James Bennett).
Voto por usar UserProfiles .
Yo uso varias aplicaciones de la tercera fiesta. Y una clave externa para un usuario siempre apuntará a auth.models.User.
Ejemplo:
class Article(models.Model):
user = models.ForeignKey(''auth.User'') # instead of your CustomUser
text = ....
Y su modelo de usuario personalizado:
class CustomUser(User):
timezone = models.CharField(max_length=50, default=''Europe/London'')
# Use UserManager to get the create_user method, etc.
objects = UserManager()
¿Qué sucederá si accede al campo de usuario a través de una instancia de Artículo? Esto provocará una excepción:
u = a_article.user
u.timezone
AttributeError: ''User'' object has no attribute ''timezone''
Tal vez esto no sea un problema para usted y no quiera evitar la consulta de base de datos adicional. Pero usaría la forma get_profile.
ACTUALIZACIÓN Mayo, 2013
Desde Django 1.5, puede extend el modelo de usuario predeterminado o substitute por un modelo completamente personalizado.
ACTUALIZACIÓN Nov, 2016
La solución anterior es obsoleta, vea el comentario de wim