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

Kak*_*kar 12 django django-migrations

我正在遵循这两个引用(一个两个)来创建自定义用户模型,以便通过电子邮件进行身份验证并向其中添加一个额外的字段。

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'
    ...
    ...
Run Code Online (Sandbox Code Playgroud)

如您所见,我已经db_table='auth_user'在类的Meta字段中添加了。另外,我在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
Run Code Online (Sandbox Code Playgroud)

这给了我一个错误:

django.db.migrations.exceptions.InconsistentMigrationHistory:迁移admin.0001_initial在其依赖项帐户之前应用。数据库'default'上的0001_initial。

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

Haz*_*ziq 22

解决方案是撤消依赖 AUTH_USER_MODEL 的现有迁移,如本答案所述。如果您尝试撤消 admin、auth、contenttypes 和 session 的迁移,并且您收到如下错误:

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

  • 首先AUTH_USER_MODEL在 settings.py 中注释掉/撤消,如果你改变了它。
  • 其次注释掉/撤消包含来自INSTALLED_APPSsettings.py 的新 AUTH_MODEL 的 django 应用程序。
  • 现在您应该能够撤销 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
Run Code Online (Sandbox Code Playgroud)
  • 现在添加您的身份验证模式应用INSTALLED_APPS和设置AUTH_USER_MODEL在settings.py一次。
  • 运行:python manage.py migrate AUTH_APP,您可能还需要为您的身份验证模型应用程序进行迁移:python manage.py makemigrations AUTH_APP

  • 应用您通过以下方式撤消的所有迁移:python manage.py migrate

你都完成了。

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


Can*_*ear 8

您必须从迁移历史记录中清除admin,auth,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
Run Code Online (Sandbox Code Playgroud)

之后,您可以运行makemigrations accountsmigrate accounts


Ele*_*nic 7

与我的特定情况一样,其他答案没有帮助(即使在我尝试删除表migrate ... zero并删除迁移文件夹后仍然出现错误),以下内容有所帮助,我是在最开始的,因此它删除db.sqlite3第一次迁移时创建的文件没有问题。(根据您的 settings.py,您可能有不同的数据库文件)。

只有当您确定不会丢失数据库文件中的重要数据(例如,您还没有在数据库中存储太多信息并且重新开始并不困难)时,您才能真正做到这一点,并且您将需要再次迁移所有内容。


小智 5

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

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

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

python manage.py makemigrations users
Run Code Online (Sandbox Code Playgroud)

将表迁移到数据库

python manage.py migrate
Run Code Online (Sandbox Code Playgroud)