web-dev-qa-db-fra.com

Migration de Django modèle utilisateur vers un modèle utilisateur personnalisé

Je suis ces deux références ( n et deux ) pour avoir un modèle d'utilisateur personnalisé afin de s'authentifier par e-mail et également d'y ajouter un champ supplémentaire.

class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        unique=True,
        max_length=254,
    )
    mobile_number = models.IntegerField(unique=True)
    is_active = models.BooleanField(default=True)
    is_admin = models.BooleanField(default=False)

    objects = UserManager()
    ...
    ...    
    class Meta:
        db_table = 'auth_user'
    ...
    ...

Comme vous pouvez le voir, j'ai ajouté le db_table='auth_user' dans les champs Meta de la classe. J'ai également inclus AUTH_USER_MODEL = 'accounts.User' et l'application de modèle utilisateur (c'est-à-dire les comptes) dans le INSTALLED_APPS dans settings.py. De plus, j'ai supprimé le dossier des migrations de l'application.

Ensuite, j'ai essayé de migrer:

$ python manage.py makemigrations accounts
Migrations for 'accounts':
  accounts/migrations/0001_initial.py:
    - Create model User

$ python manage.py migrate accounts

Ce qui me donne une erreur:

Django.db.migrations.exceptions.InconsistentMigrationHistory: La migration admin.0001_initial est appliquée avant ses comptes de dépendance.0001_initial sur la base de données 'par défaut'.

Comment puis-je migrer du modèle utilisateur Django existant) vers un modèle utilisateur personnalisé?

17
Kakar

Vous devez effacer admin, auth, contenttypes et sessions de l'historique de migration et également supprimer les tables. Tout d'abord, supprimez les dossiers de migration de vos applications, puis tapez ce qui suit:

python manage.py migrate admin zero
python manage.py migrate auth zero
python manage.py migrate contenttypes zero
python manage.py migrate sessions zero

Ensuite, vous pouvez exécuter makemigrations accounts et migrate accounts.

12
CantrianBear

Comme dans mon cas particulier, les autres réponses n'ont pas aidé (l'erreur s'est toujours produite même après avoir essayé de supprimer les tables avec migrate ... zero et même après avoir supprimé le dossier des migrations), ce qui suit a aidé, mais J'étais au tout début et donc ce n'était pas un problème de simplement supprimer le db.sqlite3 fichier créé lors de la première migration. (Selon votre settings.py, vous pourriez avoir un fichier de base de données différent).

Vous ne pouvez vraiment le faire que si vous êtes sûr de ne pas perdre de données importantes de votre fichier de base de données (par exemple, vous n'avez pas encore beaucoup d'informations stockées dans la base de données et il n'est pas difficile de recommencer), et vous aurez besoin pour tout migrer à nouveau.

4
ElectRocnic

Supprimez toutes les tables existantes de la base de données. [Remarque: les données seront perdues]

Supprimez pycache et les migrations de toutes les applications.

Exécutez des migrations pour votre application relative

python manage.py makemigrations users

Migrer les tables vers la base de données

python manage.py migrate
3
krishna chandak

La solution consiste à annuler vos migrations existantes qui dépendent de AUTH_USER_MODEL comme mentionné dans cette réponse . Dans le cas où vous essayez d'annuler les migrations pour admin, auth, contenttypes et sessions et que vous obtenez une erreur comme:

ERREURS: auth.User.groups: (fields.E304) L'accesseur inversé pour 'User.groups' se heurte à l'accesseur inversé pour 'Profile.groups'. ....

  • Tout d'abord commenter/annuler AUTH_USER_MODEL dans settings.py si vous avez changé cela.
  • Deuxièmement, commentez/annulez votre Django qui contient un nouveau AUTH_MODEL de INSTALLED_APPS dans settings.py.
  • Vous devriez maintenant être en mesure d'annuler les migrations pour l'authentification, l'administrateur, les types de contenu et les sessions en tant que:
python manage.py migrate admin zero
python manage.py migrate auth zero
python manage.py migrate contenttypes zero
python manage.py migrate sessions zero
  • Ajoutez maintenant votre application de modèle d'authentification à INSTALLED_APPS Et mettre AUTH_USER_MODEL dans votre settings.py à nouveau.
  • Courir: python manage.py migrate AUTH_APP, vous devrez peut-être également effectuer des migrations pour votre application de modèle d'authentification: python manage.py makemigrations AUTH_APP

  • Appliquez toutes les migrations que vous annulez en: python manage.py migrate.

Vous avez tous terminé.

Remarque: vous perdrez tous les utilisateurs existants présents dans la base de données.

3
M Haziq

Vous devez exécuter:

python manage.py makemigrations accounts

Avant d'exécuter le manage.py migrate (par initiale, je veux dire à la toute première fois que vous exécutez migrate sur votre projet)

il est recommandé de configurer votre modèle d'utilisateur personnalisé au début de votre projet afin que l'application "comptes" soit migrée en même temps que les tables admin, auth, contenttypes et sessions sont créées.

mais si vous avez déjà créé vos tables, vous devez suivre les instructions décrites par @ krishna-chandak: https://stackoverflow.com/a/53599345/5950111

vous pouvez lire les documents: https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project =

2
Armin Hemati Nik

Je sais que c'est plutôt une vieille question, mais pour les gens qui recherchent ce sujet comme moi aujourd'hui, voici une solution sans supprimer les migrations, laisser tomber les tables et autres trucs désagréables)

https://www.caktusgroup.com/blog/2019/04/26/how-switch-custom-Django-user-model-mid-project/

1
ElRey777