我正在关注这两个引用(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'
添加到班级的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用户模型迁移到自定义用户模型?
答案 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 accounts
和migrate 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表的同时进行迁移。
答案 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”的反向访问器冲突。 ....
AUTH_USER_MODEL
。INSTALLED_APPS
的新AUTH_MODEL。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)
我也有同样的问题。我遵循了以下步骤:
models.py
中,我设置了基本的User
模型# accounts/models.py
class User(AbstractBaseUser):
class Meta:
db_table = 'auth_user'
makemigrations
命令来生成迁移文件$ python manage.py makemigrations accounts
Migrations for 'accounts':
accounts/migrations/0001_initial.py:
- Create model User
django_migrations
表插入了具有0001_initial的记录$ echo "INSERT INTO django_migrations (app, name, applied) VALUES ('accounts', '0001_initial', CURRENT_TIMESTAMP);" | python manage.py dbshell
# 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'
...
...
运行makemigrations之后,我有了下一个迁移文件。
0002_....py
python manage.py migrate.
答案 9 :(得分:0)
在您之前的迁移之后,您的数据库中有一个 django_migrations 表,这是造成这种不一致的原因。 解决方案:从数据库中删除 django_migrations 表。 从您的应用中删除迁移文件夹
然后执行
python3 manage.py makemigrations
python3 manage.py migrate