Django首次迁移后遇InconsistentMigrationHistory,无法再次生成迁移
Django自定义用户模型迁移历史不一致问题解决
问题背景
配置自定义用户模型sfauth.User后,首次执行makemigrations正常,但再次执行时触发InconsistentMigrationHistory错误,且showmigrations显示迁移状态异常。
配置详情
settings.py
AUTH_USER_MODEL = 'sfauth.User' INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework.authtoken', # 以下为ROOT/api/apps/X下的自定义应用(ROOT为manage.py所在目录) 'api.apps.sfauth', # 包含自定义用户模型 'api.apps.admin', # 自定义Admin站点 ]
自定义Admin代码
apps/admin/admin.py
class SFAdminSite(AdminSite): """ 自定义Django Admin页面 """ site_header = ADMIN_HEADER
apps/admin/apps.py
class SFAdminConfig(apps.AdminConfig): default_site = 'api.apps.admin.admin.SFAdminSite'
错误现象
- 首次执行
makemigrations输出正常:
Migrations for 'sfauth': api\api\apps\sfauth\migrations\0001_initial.py - Create model User - Create model APIRequestLog
- 再次执行
makemigrations触发错误:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency sfauth.0001_initial on database 'default'.
- 首次
migrate输出正常,但showmigrations显示部分迁移状态异常:
manage.py showmigrations admin [X] 0001_initial [X] 0002_logentry_remove_auto_add [X] 0003_logentry_add_action_flag_choices auth [X] 0001_initial [X] 0002_alter_permission_name_max_length [X] 0003_alter_user_email_max_length [X] 0004_alter_user_username_opts [X] 0005_alter_user_last_login_null [X] 0006_require_contenttypes_0002 [X] 0007_alter_validators_add_error_messages [X] 0008_alter_user_username_max_length [X] 0009_alter_user_last_name_max_length [X] 0010_alter_group_name_max_length [X] 0011_update_proxy_permissions [X] 0012_alter_user_first_name_max_length authtoken [ ] 0001_initial [ ] 0002_auto_20160226_1747 [ ] 0003_tokenproxy contenttypes [X] 0001_initial [X] 0002_remove_content_type_name sessions [X] 0001_initial sfauth [ ] 0001_initial
已尝试无效方法
- 注释自定义用户模型,重新生成并应用迁移后恢复配置
- 重建数据库
解决方案
核心原因
默认django.contrib.admin的迁移依赖原生auth.User,当设置AUTH_USER_MODEL为自定义模型后,Django会自动让admin迁移依赖自定义用户模型的迁移,但之前已经应用了默认admin的迁移,导致依赖顺序颠倒,触发历史不一致错误。
具体修复步骤
替换默认Admin应用:在
INSTALLED_APPS中移除django.contrib.admin,保留自定义的api.apps.admin(自定义SFAdminConfig已替代默认Admin配置)。修改后的INSTALLED_APPS片段:INSTALLED_APPS = [ 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'rest_framework', 'rest_framework.authtoken', 'api.apps.sfauth', 'api.apps.admin', # 仅保留自定义Admin应用 ]清理迁移历史与数据库:
- 删除所有应用(包括
sfauth、admin、auth等)的migrations目录下,除了__init__.py之外的所有迁移文件和__pycache__文件夹 - 删除数据库文件(如SQLite的
db.sqlite3)
- 删除所有应用(包括
重新生成并应用迁移:
python manage.py makemigrations python manage.py migrate
验证
执行showmigrations,所有迁移应显示为[X]状态,再次执行makemigrations不会触发错误。
内容的提问来源于stack exchange,提问作者cclloyd
相关产品推荐
相关产品推荐

