web-dev-qa-db-ja.com

Djangoユーザーモデルからカスタムユーザーモデルへの移行

私はこれらの2つの参照( one および two )に従って、電子メールで認証し、それに追加のフィールドを追加するためのカスタムユーザーモデルを用意しています。

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'
    ...
    ...

ご覧のとおり、db_table='auth_user'をクラスのメタフィールドに追加しました。また、settings.pyのAUTH_USER_MODEL = 'accounts.User'INSTALLED_APPSとユーザーモデルアプリ(つまり、アカウント)を含めました。さらに、アプリからmigrationsフォルダーを削除しました。

次に、移行を試みました:

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

$ python manage.py migrate accounts

これは私にエラーを与えます:

Django.db.migrations.exceptions.InconsistentMigrationHistory:マイグレーションadmin.0001_initialは、データベース 'default'の依存関係account.0001_initialの前に適用されます。

既存のDjangoユーザーモデルからカスタムユーザーモデルに移行するにはどうすればよいですか?

17
Kakar

移行履歴からadmin、auth、contenttypes、およびセッションをクリアし、テーブルも削除する必要があります。まず、アプリの移行フォルダーを削除してから、次のように入力します。

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

その後、makemigrations accountsおよびmigrate accounts

12
CantrianBear

私の特定のケースのように、他の回答は役に立ちませんでした(migrate ... zeroを使用してテーブルを削除しようとした後、およびmigrationsフォルダーを削除した後でも、エラーは引き続き発生しました)、以下は役に立ちましたbut最初の段階だったので、最初に移行するたびに作成されるdb.sqlite3ファイルdeleteだけでも問題ありませんでした。 (settings.pyによっては、別のデータベースファイルが存在する場合があります)。

データベースファイルから重要なデータが失われないことが確実である場合(たとえば、まだデータベースに多くの情報が保存されておらず、最初からやり直すことが難しくない場合)にのみこれを行うことができます。すべてを再度移行します。

4
ElectRocnic

データベースから既存のすべてのテーブルを削除します。[注:データは失われます]

すべてのアプリからpycacheと移行を削除します。

相対アプリの移行を実行する

python manage.py makemigrations users

テーブルをデータベースに移行する

python manage.py migrate
3
krishna chandak

解決策は、前述のAUTH_USER_MODELに依存する既存の移行を元に戻すことです この回答では 。 admin、auth、contenttypes、およびセッションの移行を元に戻そうとすると、次のようなエラーが発生します。

エラー:auth.User.groups:(fields.E304)「User.groups」のリバースアクセサーが「Profile.groups」のリバースアクセサーと競合します。 ....

  • 最初に、変更した場合は、settings.pyのAUTH_USER_MODELをコメントアウト/元に戻します。
  • 次に、settings.pyのINSTALLED_APPSからの新しいAUTH_MODELを含むDjangoアプリをコメントアウト/元に戻します。
  • これで、auth、admin、contenttypes、およびセッションの移行を元に戻すことができるはずです。
python manage.py migrate admin zero
python manage.py migrate auth zero
python manage.py migrate contenttypes zero
python manage.py migrate sessions zero
  • 次に、認証モデルアプリをINSTALLED_APPSに追加し、settings.pyでAUTH_USER_MODELを再度設定します。
  • 実行:python manage.py migrate AUTH_APP、認証モデルアプリの移行も必要になる場合があります:python manage.py makemigrations AUTH_APP

  • 元に戻したすべての移行を適用:python manage.py migrate

すべて完了です。

注:データベースに存在する既存のユーザーはすべて失われます。

3
M Haziq

実行する必要があります:

python manage.py makemigrations accounts

Beforeを実行する前にmanage.py migrate(最初は、プロジェクトで最初にmigrateを実行したときを意味します)

プロジェクトの開始時にカスタムユーザーモデルを設定することをお勧めします。これにより、admin、auth、contenttypes、sessionsテーブルが作成されると同時に「アカウント」アプリが移行されます。

ただし、すでにテーブルを作成している場合は、@ krishna-chandakで説明されている指示に従ってください: https://stackoverflow.com/a/53599345/5950111

あなたはドキュメントを読むことができます: https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project =

2

私はそれがかなり古い質問であることを知っていますが、今日のようにこのトピックをグーグルする人々のために、マイグレーションを削除したり、テーブルをドロップしたり、その他の厄介なことをしないソリューションがあります)

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

1
ElRey777