2010-05-03 9 views
15

Um das Benutzerobjekt um benutzerdefinierte Felder zu erweitern, empfehlen die Django-Dokumente die Verwendung von UserProfiles. Doch nach this Antwort auf eine Frage über diesen von einem Jahr oder so zurück:Benutzerobjekt in Django erweitern: Benutzermodellvererbung oder UserProfile verwenden?

erstreckt django.contrib.auth.models.User funktioniert auch besser jetzt - seit dem Refactoring von Djangos Erbe Code in dem Modelle API.

und Artikel wie this legen, wie die User-Modell mit benutzerdefinierten Feldern zu erweitern, zusammen mit den Vorteilen (Eigenschaften direkt aus dem Benutzerobjekt abzurufen, anstatt durch die .get_profile()).

Also habe ich mich gefragt, ob es einen Konsens zu diesem Thema gibt, oder Gründe, das eine oder andere zu verwenden. Oder was denkt das Django-Team derzeit?

+0

Mögliches Duplikat von [Erweitern des Benutzermodells mit benutzerdefinierten Feldern in Django] (http: // stackoverflow.com/questions/44109/extending-the-user-modell-with-custom-fields-in-django) –

Antwort

8

Ich stimme für die Verwendung UserProfiles.

Ich benutze mehrere Drittanbieter-Apps. Und ein Fremdschlüssel für einen Benutzer wird immer auf auth.models.User verweisen.

Beispiel:

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

Und Ihr individuelles User-Modell:

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

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

Was wird passieren, wenn Sie das Benutzerfeld durch eine Artikel-Instanz zugreifen? Dies wird eine Ausnahme ausgelöst:

u = a_article.user 
u.timezone 

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

Vielleicht dies für Sie kein Problem ist und Sie wan't die zusätzliche DB-Abfrage zu vermeiden. Aber ich würde die Methode get_profile verwenden.

UPDATE Mai 2013

Da Django 1.5 Sie das Standard-User-Modell oder substitute mit einem vollständig angepasst Modell extend können.

UPDATE November 2016

Die obige Lösung ist veraltet, siehe den Kommentar von wim

+1

Dies wird Abhängigkeiten Problem in django 1.7 Migrationen –

+2

erstellen Heute sollten alle Drittanbieter-Apps * settings.AUTH_USER_MODEL haben 'als die Beziehung, wenn sie' 'auth.User'' hartcodiert haben, dann ist das die Schuld Dritter. – wim

2

Hier ist, was sagt James Bennett in diesem blog entry about model inheritance:

ich, dass Wette würde wahrscheinlich 90% oder mehr der Dinge, die Leute sagen, dass sie mit Unterklassen tun möchten, könnten besser erreicht werden, indem stattdessen ein verwandtes Modell definiert und mit einem eindeutigen Fremdschlüssel verknüpft wird.

Deshalb glaube ich, der beste Weg, nach wie vor zu gehen, ist eine externe Anwendung, wie zum Beispiel einiger Komponenten von Pinax oder dem django-profiles app (ursprünglich aus dem gleichen James Bennett) zu verwenden.

Verwandte Themen