2010-05-03 21 views
15

Para ampliar el objeto Usuario con campos personalizados, los documentos de Django recomiendan usar UserProfiles. Sin embargo, de acuerdo con this respuesta a una pregunta acerca de esto de un año o así:Objeto de usuario extendido en Django: ¿herencia de modelo de usuario o uso de perfil de usuario?

extendiéndose django.contrib.auth.models.User también funciona mejor ahora - desde la refactorización del código de la herencia de Django en el modelos API.

y artículos tales como this trazan la forma de extender el modelo de usuario con campos personalizados, junto con las ventajas (recuperación de propiedades directamente desde el objeto de usuario, en lugar de a través de la .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 el equipo de Django piensa actualmente?

+0

Posible duplicado de [Extender el modelo de usuario con campos personalizados en Django] (http: // stackoverflow.com/preguntas/44109/extender el usuario-modelo-con-custom-fields-en-django) –

Respuesta

8

Yo voto por usar UserProfiles.

Uso varias aplicaciones de terceros. 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 personalizada:

class CustomUser(User): 
    timezone = models.CharField(max_length=50, default='Europe/London') 

    # Use UserManager to get the create_user method, etc. 
    objects = UserManager() 

Cuál será sucede si accede al campo de usuario a través de un ejemplo, el artículo? Esto provoca una excepción:

u = a_article.user 
u.timezone 

AttributeError: 'User' object has no attribute 'timezone' 

Tal vez esto no es un problema para ti y te wa no para evitar la consulta adicional DB. Pero usaría la forma get_profile.

actualización de mayo de 2013

Desde Django 1.5 se puede extend el modelo de usuario por defecto, o substitute con un modelo completamente personalizado.

ACTUALIZACIÓN noviembre de 2016

La solución anterior es obsoleta, véase el comentario de Wim

+1

Esto creará tema dependencias en Django 1.7 migraciones –

+2

En estos días, las aplicaciones de terceros * * deben tener 'settings.AUTH_USER_MODEL 'como la relación, si han codificado' 'auth.User'' entonces eso es culpa de un tercero ... – wim

2

Aquí está lo que dice en este James Bennettblog entry about model inheritance:

Apostaría a que, probablemente, El 90% o más de las cosas que la gente dice que quiere hacer con las subclases podría lograrse mejor al definir un modelo relacionado y vincularlo con una clave externa única.

así que creo que la mejor manera de ir es todavía utilizar una aplicación externa, como algunos componentes de Pinax, o la aplicación django-profiles (originalmente de la misma James Bennett).

Cuestiones relacionadas