2010-09-04 8 views
8

Django erstellt standardmäßig ein Primärschlüsselfeld für jedes Modell mit dem Namen "id" mit einem Typ AutoField. Bei meinen Modellen überschreibe ich, dass ein benutzerdefinierter UUIDField als Primärschlüssel verwendet wird, indem das Attribut "primary_key" verwendet wird. Ich möchte auch das User Modell in django.contrib.auth, um eine UUIDField als Primärschlüssel zu haben, aber dies scheint nicht möglich zu sein, ohne den User Modell-Quellcode zu ändern.Django-Benutzermodell und benutzerdefiniertes Primärschlüsselfeld

Gibt es einen empfohlenen Weg, dieses Problem anzugehen?

Antwort

6

Dies scheint nicht möglich zu sein, ohne den Quellcode des Benutzermodells zu ändern.

Korrekt. Sofern Sie nicht bereit sind, User zu ändern (oder zu ersetzen), gibt es keinen Weg.

Eine (dünne, hackische) Möglichkeit, dies zu tun wäre, eine UserProfile für jede User Instanz anhängen. Jede User sollte genau eineUserProfile haben. Sie können dann Ihre UUIDField zu dem Profil hinzufügen. Sie müssen noch benutzerdefinierte Abfragen durchführen, um von UUIDField zu id zu übersetzen.

Wenn Sie den Namen UserProfile nicht mögen, können Sie ihn entsprechend umbenennen. Der Schlüssel ist, dass Sie eine Eins-zu-eins-Beziehung zu User haben.

+0

Ich dachte, das wäre der Fall. Vielen Dank. – Andrew

4

Mit der Veröffentlichung von Django 1.5 unterstützt die Authentifizierungs-Backend nun individuelle Benutzermodelle:

https://docs.djangoproject.com/en/dev/topics/auth/customizing/#substituting-a-custom-user-model

Ein E-Mail-Feld kann als Benutzernamen-Feld und das primary_key Argument verwendet werden können, auf sie gesetzt werden:

class CustomUser(AbstractBaseUser, PermissionsMixin): 
    email = models.EmailField(max_length=254, unique=True, db_index=True, primary_key=True) 

    USERNAME_FIELD = 'email' 
Verwandte Themen