AUTH_USER_MODEL指的是未安装的模型'%s'。

9
我在模型中使用了CustomUser。这是用户管理器。
class UserManager(BaseUserManager):

    def create_user(self, email, username, password=None, is_staff=False, is_superuser=False, is_active=False,
                    is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True):
        logger = logging.getLogger(__name__)
        logger.info("REGULAR user created!")
        if not email:
            raise ValueError('Email is required')
        if not username:
            raise ValueError('Username is required.')
        email = self.normalize_email(email)
        user = self.model(email=email, username=username, is_staff=is_staff, is_superuser=is_superuser,
                          is_active=is_active, is_bot=is_bot, is_mobile_verified=is_mobile_verified,
                          is_online=is_online, is_logged_in=is_logged_in)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, username, password):
        logger = logging.getLogger(__name__)
        logger.info("SUPER user created!")
        return self.create_user(email, username, password=password, is_staff=True, is_superuser=True, is_active=True,
                                is_bot=False, is_mobile_verified=False, is_online=True, is_logged_in=True)

这是我对自定义用户模型的定义。
class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(unique=True, max_length=255)
    mobile = PhoneNumberField(null=True)
    username = models.CharField(null=False, unique=True, max_length=255)
    full_name = models.CharField(max_length=255, blank=True, null=True)
    birthday = models.DateField(null=True)
    gender = models.CharField(max_length=255, null=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)
    is_active = models.BooleanField(default=False)
    is_mobile_verified = models.BooleanField(default=False)
    is_online = models.BooleanField(default=False)
    is_logged_in = models.BooleanField(default=True)
    is_bot = models.BooleanField(default=False)
    location = models.ForeignKey(Location, on_delete=models.SET_NULL, null=True)

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['username']
    #objects = UserManager()

    get_user_model().objects.create_user(...)

如果我取消注释objects = UserManager()这一行,那么我就可以运行服务器,但是从管理后端创建的超级用户无法登录。 如果我使用get_user_model(),代码会出错,我会得到以下错误

 "AUTH_USER_MODEL refers to model '%s' that has not been installed" % settings.AUTH_USER_MODEL
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'bouncer.User' that has not been installed

但是在我的settings.py中,我已经定义了认证用户模型

AUTH_USER_MODEL = 'bouncer.User'

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend',
)

这里我做错了什么?

1
你成功让它工作了吗?我从2.0.6升级到2.1.4后,出现了这个错误,而我的设置与你的完全相同。 - Ray
@Ray 不,我做不到。我手动移动了这个项目...想象一下! - Melissa Stewart
你能否在settings.py中发布你的INSTALLED_APPS?可能是导入失败或导入顺序需要更改。 - Jacob
1
你是否在自定义用户模型中调用了 get_user_model().objects.create_user(...) 函数? - Jacob
1
我是否理解错了:为什么你在User类定义中调用了“create_user”? - RishiG
在尝试为AUTH_USER_MODEL进行“makemigrations”时,我遇到了这个错误消息。原因是在使用get_user_model()的第二个模型与AUTH_USER_MODEL相同的应用程序内。必须注释掉第二个模型并分两步进行“makemigrations”。 - mirek
10个回答

15
对于2020年以后阅读本文的任何人,我怀疑这个问题与依赖关系有关。我遇到了与OP相同的错误。
您应该先进行以下两个检查:
1-您的app是否在settings.py中的installed apps列表中?
2-在settings.py中是否设置了AUTH_USER_MODEL =“app_name_from_apps_py.model_name”?
这已经是我阅读的大部分其他答案所涵盖的内容。
我没有意识到阅读文档时使用get_user_model()需要先建立模型。当然,对吗?!
因此,在上面,当OP使用get_user_model()时,他们创建了循环依赖。 您不能在创建此模型的类中使用get_user_model()。

5
那个错误看上去像是你的 INSTALLED_APPS 中没有 bouncer。
因此,需要满足以下条件:
  • 必须有 bouncer/models.py 文件,其中包含 User 模型(或者在 models/__init__.py 文件中引入该模型)
  • 在 settings 中的 INSTALLED_APPS 列表中包含 'bouncer'
  • AUTH_USER_MODEL = 'bouncer.User' (如你所做)。

1
是的,Bouncer在已安装应用程序列表中。 - Melissa Stewart
1
在已安装应用程序列表中,bouncer 是否先于您的应用程序?从问题本身并不能完全了解您何时实际调用 get_user_model,但如果这是在 Django 加载您的应用程序时进行的,则必须首先加载 bouncer - RishiG

4
在我的情况下,我无意中将abstract = True这个属性粘贴到了我的自定义用户的Meta类中。因此它会引发这个错误。

3
对我来说,这是因为我有myapp/models/__init__.py,我尝试将自定义的User模型定义放在myapp/models/user.py中,并设置AUTH_USER_MODEL = myapp.User。将自定义的User模型定义移动到myapp/models/__init__.py中解决了问题。我无法在__init__.py中导入它;我必须把定义移到那里。

哇,尝试了很多方法,这个是有效的!谢谢! - Macumbaomuerte

0

永远不要在一个应用的models.py文件中放置自定义用户模型和包含到用户模型链接的其他模型。这可能会导致错误发生。

导致错误的坏主意:

# customUserModel/models.py
from django.contrib.auth.models import AbstractUser
from django.conf import settings

class User(AbstractUser):
    pass

class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    some_field = models.CharField(max_length=25)

这是一个好主意:

# customUserModel/models.py
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

# additionalUserProfile/models.py
from django.conf import settings
class Profile(models.Model):
    user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    some_field = models.CharField(max_length=25)

#settings.py
AUTH_USER_MODEL = 'customUserModel.User'

0

请确保在 admin.py 中注册模型,而不是在 models.py 中进行注册

# admin.py
from django.contrib.auth.admin import UserAdmin

admin.site.register(YourUser, UserAdmin)

这对我解决了问题。


-1

我知道这是一个老问题,但在找到我的错误之前,我曾为此问题苦苦挣扎了两天。我的错误是未能遵循模型组织在Django Models文档中

我本来可以评论@5fec的答案,但我还没有足够的声望。我的答案与他的类似,只是在models/__init__.py中导入了模型,并且对于我来说起作用了。我完全忽略了__init__.py文件。

如果你正确地编写了AUTH_USER_MODEL = <app_name>.<user_model>,并且在INSTALLED_APPS列表中有你的'<app_name>',但仍然出现此错误,那么你的<custom_user>模型(例如User)可能放错了位置。

它需要定义在以下任一位置:

  • <app_name>.models.py

或者

  • <app_name>/models/<arbitrary_name>.py 并且 存在一个包含 from .<arbitrary_name> import <custom_user> 这一行的 <app_name>/models/__init__.py

-1
由于某些原因,导入from django.contrib.auth.backends import BaseBackend引起了这个问题。我怀疑BaseBackend试图使用用户模型,但是无法使用,因为它在文件中定义得更靠后。然而,如果您在导入之前定义您的模型,那么它将可以正常工作。

-1
尝试将弹跳应用程序在您的已安装应用程序中的位置进行移动,这对我有用。

-2
尝试在导入from django.contrib.auth.models import AbstractUser之后才导入from django.db import models

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接