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

Django自定义用户模型迁移报错:未找到custom_auth应用

解决Django迁移时自定义用户模型的权限引用错误

错误根源

  1. 重复继承引发字段冲突:你的CustomUser同时继承了AbstractUser和PermissionsMixin,但AbstractUser本身已经包含PermissionsMixin的所有权限逻辑,重复继承导致Django错误将权限模型(Group、Permission)关联到不存在的custom_auth应用。
  2. AUTH_USER_MODEL配置错误:settings.py中可能错误将AUTH_USER_MODEL指向custom_auth.CustomUser,但你的自定义用户模型实际在main应用下。
  3. 迁移文件残留无效引用:之前生成的迁移文件中,可能残留了指向custom_auth的无效关联。

修复步骤

1. 修正自定义用户模型

修改models.py,移除重复继承和冗余字段:

from django.contrib.auth.models import AbstractUser, BaseUserManager
from django.db import models
from django.utils import timezone

class CustomUser(AbstractUser):
    # 仅保留需要扩展/覆盖的字段,AbstractUser已内置username、is_active等基础字段
    email = models.EmailField(max_length=255, unique=True)
    username = models.CharField(max_length=127, unique=True)  # 覆盖原username的长度限制

    USERNAME_FIELD = 'username'
    EMAIL_FIELD = 'email'
    REQUIRED_FIELDS = ['email']  # USERNAME_FIELD无需加入REQUIRED_FIELDS,仅保留必填的email

    objects = CustomUserManager()

    def get_full_name(self):
        return self.username

    def get_short_name(self):  # 修正拼写错误:nane → name
        return self.username or self.email.split("@")[0]

    class Meta:
        verbose_name = 'User'
        verbose_name_plural = 'Users'

2. 修正settings.py配置

确保AUTH_USER_MODEL指向正确的应用和模型,同时检查INSTALLED_APPS:

# settings.py
INSTALLED_APPS = [
    # 其他应用...
    'main',  # 确保自定义用户模型所在的应用已注册
    # 移除不存在的'custom_auth'应用(如果之前误加)
]

# 关键配置:指向main应用下的CustomUser
AUTH_USER_MODEL = 'main.CustomUser'

3. 清理旧迁移并重新生成

  1. 删除main/migrations目录下除__init__.py之外的所有迁移文件。
  2. 清理数据库中残留的迁移记录:
    • SQLite:直接删除数据库文件,或用数据库工具删除django_migrations表中app='main'的记录;
    • PostgreSQL/MySQL:执行SQL语句 DELETE FROM django_migrations WHERE app='main';。
  3. 重新生成迁移:
python manage.py makemigrations
  1. 执行迁移:
python manage.py migrate

4. 辅助优化(可选)

  • 管理器优化:修改managers.py的create_user方法,确保必填字段被正确处理:
class CustomUserManager(BaseUserManager):
    def create_user(self, username, email, password, **extra_fields):
        if not email:
            raise ValueError('Users must have an email address')
        if not username:
            raise ValueError('Users must have a username')
        
        email = self.normalize_email(email)
        user = self.model(username=username, email=email, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    # 保留原create_superuser方法即可
  • 登录视图优化:views.py中authenticate无需同时传入username和email,根据登录逻辑二选一:
# 示例:用用户名登录
user = authenticate(username=credentials['username'], password=credentials['password'])
# 或用邮箱登录:
# user = authenticate(email=credentials['email'], password=credentials['password'])

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:54:57