2010-05-03 4 views
15

Per estendere l'oggetto Utente con campi personalizzati, i documenti di Django consigliano di utilizzare UserProfiles. Tuttavia, secondo this risposta ad una domanda su questo da un anno o giù di lì di nuovo:Estensione dell'oggetto utente in Django: ereditarietà del modello utente o utilizzo di UserProfile?

estendendo django.contrib.auth.models.User funziona anche meglio ora - da quando il refactoring del codice dell'eredità di Django nel modelli API.

E articoli come this lay out come estendere il modello User con campi personalizzati, insieme ai vantaggi (il recupero di proprietà direttamente dall'oggetto utente, piuttosto che attraverso il .get_profile()).

Quindi mi chiedevo se c'è un consenso su questo problema, o ragioni per usare l'uno o l'altro. O anche quello che la squadra Django attualmente pensa?

+0

Possibile duplicato di [Estensione del modello utente con campi personalizzati in Django] (http: // stackoverflow.it/questions/44109/extending-the-user-model-with-custom-fields-in-django) –

risposta

8

Io voto per l'utilizzo di UserProfiles.

Uso varie app di terze parti. E una chiave esterna per un utente punta sempre su auth.models.User.

Esempio:

class Article(models.Model): 
    user = models.ForeignKey('auth.User') # instead of your CustomUser 
    text = .... 

E la vostra abitudine modello User:

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

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

Che cosa sarà accadere se si accede al campo utente attraverso un esempio l'articolo? Ciò genera un'eccezione:

u = a_article.user 
u.timezone 

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

forse questo non è un problema per voi e vi wa non per evitare la query aggiuntiva DB. Ma vorrei usare il modo get_profile.

UPDATE maggio 2013

Dal Django 1.5 è possibile extend il modello utente predefinito o substitute con un modello completamente personalizzato.

UPDATE novembre 2016

La soluzione di cui sopra è obsoleto, vedere il commento da Wim

+1

Questo creerà il problema delle dipendenze nelle migrazioni di django 1.7 –

+2

In questi giorni, qualsiasi app di terze parti * dovrebbe * avere "settings.AUTH_USER_MODEL 'come la relazione, se hanno hardcoded' 'auth.User'', allora è colpa di terzi. – wim

2

Qui è ciò che dice in questo James Bennettblog entry about model inheritance:

scommetto che, probabilmente, Il 90% o più delle cose che le persone dicono di voler fare con le sottoclassi potrebbero essere meglio realizzate definendo invece un modello correlato e collegandolo con una chiave esterna unica.

quindi credo che il modo migliore per andare è ancora necessario utilizzare un'applicazione esterna, come ad esempio alcuni componenti della Pinax, o la django-profiles app (in origine dallo stesso James Bennett).