You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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'

错误现象

  1. 首次执行makemigrations输出正常:
Migrations for 'sfauth':
  api\api\apps\sfauth\migrations\0001_initial.py
    - Create model User
    - Create model APIRequestLog
  1. 再次执行makemigrations触发错误:
django.db.migrations.exceptions.InconsistentMigrationHistory: Migration admin.0001_initial is applied before its dependency sfauth.0001_initial on database 'default'.
  1. 首次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的迁移,导致依赖顺序颠倒,触发历史不一致错误。

具体修复步骤

  1. 替换默认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应用
    ]
    
  2. 清理迁移历史与数据库:

    • 删除所有应用(包括sfauth、admin、auth等)的migrations目录下,除了__init__.py之外的所有迁移文件和__pycache__文件夹
    • 删除数据库文件(如SQLite的db.sqlite3)
  3. 重新生成并应用迁移:

    python manage.py makemigrations
    python manage.py migrate
    

验证

执行showmigrations,所有迁移应显示为[X]状态,再次执行makemigrations不会触发错误。

内容的提问来源于stack exchange,提问作者cclloyd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 02:06:24