从django用户模型迁移到自定义用户模型

时间:2017-03-14 18:50:36

标签: django django-migrations

我正在关注这两个引用(onetwo)以获得自定义用户模型,以便通过电子邮件进行身份验证,并为其添加额外字段。

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'添加到班级的Meta字段中。另外,我已将AUTH_USER_MODEL = 'accounts.User'和用户模型应用(即帐户)包含在settings.py中的INSTALLED_APPS中。此外,我从应用程序中删除了迁移文件夹。

然后尝试迁移:

$ 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在数据库'默认'的依赖关系account.0001_initial之前应用。

如何从现有的django用户模型迁移到自定义用户模型?

10 个答案:

答案 0 :(得分:6)

您必须从迁移历史记录中清除admin,auth,contenttypes和sessions,并删除表。首先,删除应用的迁移文件夹,然后键入以下内容:

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 accountsmigrate accounts

答案 1 :(得分:3)

在我的特定情况下,其他答案无济于事(即使我尝试使用migrate ... zero删除表,甚至删除了Migrations文件夹后仍然出现错误),以下帮助但是,我只是刚开始,因此只需删除在您第一次迁移时创建的db.sqlite3文件就没有问题。 (取决于您的settings.py,您可能具有不同的数据库文件。)

只有在确保您不会丢失数据库文件中的重要数据(例如您尚未在数据库中存储大量信息并且不难重新开始)的情况下,您才能真正执行此操作;并且您将需要再次迁移所有内容。

答案 2 :(得分:3)

从数据库中删除现有的所有表。[注意:数据将丢失]

从所有应用程序中删除pycache和迁移。

为您的相对应用程序运行迁移

python manage.py makemigrations users

将表迁移到数据库

python manage.py migrate

答案 3 :(得分:1)

您需要运行:

python manage.py makemigrations accounts
申请前

python manage.py migrate
第一次在你的项目上

建议您在项目开始时设置自定义用户模型。所以你将拥有"帐户"应用程序在创建admin,auth,contenttypes,sessions表的同时进行迁移。

您可以阅读文档:https://docs.djangoproject.com/en/2.0/topics/auth/customizing/#using-a-custom-user-model-when-starting-a-project

答案 4 :(得分:1)

我知道这是一个比较老的问题,但是对于今天像我这样使用谷歌搜索此主题的人来说,这是一种解决方案,无需删除迁移,删除表格和其他令人讨厌的内容)

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

答案 5 :(得分:1)

解决方案是撤消依赖于in this answer的AUTH_USER_MODEL的现有迁移。如果您尝试撤消admin,auth,contenttypes和session的迁移,则会收到类似以下错误:

  

错误:   auth.User.groups :(字段E304)“ User.groups”的反向访问器与“ Profile.groups”的反向访问器冲突。   ....

  • 如果已更改,请首先在settings.py中注释掉/撤消AUTH_USER_MODEL
  • 第二次注释掉/撤消您的django应用,该应用包含来自settings.py中INSTALLED_APPS的新AUTH_MODEL。
  • 现在您应该能够以以下方式撤消对auth,admin,contenttypes和session的迁移:
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

大功告成。

  

注意:您将丢失数据库中存在的所有现有用户。

答案 6 :(得分:0)

迁移归零并没有帮助我。我不得不删除整个数据库:

sudo -u postgres psql
drop database YOURDATABASENAME;
create database YOURDATABASENAME;

然后:

python ./manage.py makemigrations MYAPPNAME
python ./manage.py migrate MYAPPNAME
python ./manage.py migrate

这些之后,我挺身而出。

答案 7 :(得分:0)

我有类似的问题,我必须在项目中间介绍自定义用户模型。因此,遵循以下步骤可以帮助我解决该问题,而不会丢失表或丢失数据。

(1)为应用创建一个初始的空迁移(“帐户”)

python manage.py makemigrations accounts --empty

(2)运行迁移

python manage.py migrate

(3)更新数据库django_migrations表中的时间戳,以便将“帐户”初始迁移到“管理员”初始时间戳。

UPDATE django_migrations SET applied=<<admin 0001_initial date>> WHERE app='accounts' and name='0001_initial'; 

(4)现在创建没有任何字段的自定义用户模型(从AbstractUser派生),并将表名称设置为auth_user。您基本上是在重用数据库中现有的auth用户表。

class User(AbstractUser):
    class Meta:
        db_table = 'auth_user'

(4)现在运行迁移,并将迁移复制到0001_initial并从依赖项数组中删除“ 0001_initial”。还要删除新创建的迁移文件。

python manage.py makemigrations accounts
cp accounts/migrations/0002_user.py accounts/migrations/0001_initial.py
edit the file 0001_initial.py
rm accounts/migrations/0002_user.py  (remove migration file)

(5)现在添加您的自定义字段,运行makemigrations并照常进行迁移。

答案 8 :(得分:0)

我也有同样的问题。我遵循了以下步骤:

  1. models.py中,我设置了基本的User模型
# accounts/models.py
class User(AbstractBaseUser):
    class Meta:
        db_table = 'auth_user'
  1. 然后,我运行了makemigrations命令来生成迁移文件
$ python manage.py makemigrations accounts
Migrations for 'accounts':
  accounts/migrations/0001_initial.py:
    - Create model User
  1. 下一步,我向django_migrations表插入了具有0001_initial的记录
$ echo "INSERT INTO django_migrations (app, name, applied) VALUES ('accounts', '0001_initial', CURRENT_TIMESTAMP);" | python manage.py dbshell
  1. 更新模型中的最新
# accounts/models.py
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'
    ...
    ...
  1. 我需要再次移民

运行makemigrations之后,我有了下一个迁移文件。

0002_....py
  1. 再次移民
python manage.py migrate.

答案 9 :(得分:0)

在您之前的迁移之后,您的数据库中有一个 django_migrations 表,这是造成这种不一致的原因。 解决方案:从数据库中删除 django_migrations 表。 从您的应用中删除迁移文件夹

然后执行

python3 manage.py makemigrations 
python3 manage.py migrate