9
votes

Modèle utilisateur Django et champ de clé primaire personnalisé

Django par défaut fait un champ de clé primaire sur chaque modèle nommé " ID ", avec un type de autofield . Sur mes modèles, je remplace cela pour utiliser un uuidfield primaire ". Je voudrais aussi le modèle dans django.contrib.auth pour avoir un uuidfield comme clé primaire, mais cela ne semble pas être possible sans changer le code de source utilisateur .

Y a-t-il une façon recommandée d'aborder ce problème?


0 commentaires

3 Réponses :


7
votes

Cela ne semble pas être possible sans changer le code source de modèle d'utilisateur.

correct. Sauf si vous êtes prêt à changer (ou à remplacer) utilisateur il n'y a pas de moyen.

Un moyen (ténu, hackish) de le faire serait de joindre un userprofile pour chaque utilisateur . Chaque utilisateur doit avoir exactement un userprofile . Vous pouvez ensuite ajouter votre uuidfield au profil. Vous devrez toujours faire une interrogation personnalisée pour traduire depuis uuidfield à id .

Si vous n'aimez pas le nom userprofile Vous pouvez le renommer de manière appropriée. La clé est que vous avez une relation individuelle à utilisateur .


2 commentaires

J'ai pensé que ce serait le cas. Merci.


Notez que cette réponse est longue dépassée. Voir les soviuts répondre à la place.



9
votes

Avec la sortie de Django 1.5, le backend d'authentification prend désormais en charge les modèles utilisateur personnalisés:

https://docs.djangoproject.com/fr/dev/topics/auth/customizing/#ssubstitutant-a-custom-user-model p>

Un champ de messagerie peut être utilisé comme champ d'utilisateur et le Primument_key peut être défini dessus: P>

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

    USERNAME_FIELD = 'email'


1 commentaires

Vous n'avez pas besoin db_index = true . "Notez que lorsque un unique est vrai, vous n'avez pas besoin de spécifier db_index, car unique implique la création d'un index." docs.djangoproject.com/fr/3.1/ref/models/fields / # unique



5
votes

On pourrait tirer parti de l'abstraiteur code> et apportez les modifications suivantes

class CustomUser(AbstractUser):
    email = models.EmailField(max_length=254, unique=True, db_index=True, primary_key=True)
    name = models.CharField(max_length=50)

    USERNAME_FIELD = 'email'
    REQUIRED_FILEDS = ['name']


0 commentaires