AUTH_USER_MODEL指的是未安装的模型。

9

我遇到了一个错误

ImproperlyConfigured at /admin/
AUTH_USER_MODEL refers to model 'ledger.User' that has not been installed

我只在生产服务器上遇到这个问题,而在本地主机上运行时没有出现。起初只有在进行某个请求时才会出现,然后我认为我的数据库可能已经不同步了,所以我删除了所有的表格,然后运行manage.py syncdb。现在,这个错误似乎已经传播开来,即使进入管理员页面也会出现这个错误。

我从未见过这个错误,也无法弄清楚问题出在哪里。我已经在settings.py中定义了AUTH_USER_MODEL:

...
INSTALLED_APPS = (
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'ledger',
    'extension',
    'plugin',
    'social.apps.django_app.default',
)

AUTH_USER_MODEL = 'ledger.User'

...

models.py:

...
class User(AbstractUser):
    def __unicode__(self):
        return self.username
    balance = models.IntegerField(default=0)
    total_pledged = models.IntegerField(default=0)
    last_pledged = models.ForeignKey('Transaction', related_name='pledger', blank=True, null=True)
    extension_key = models.CharField(max_length=100, null=True, blank=True)
    plugin_key = models.CharField(max_length=100, null=True, blank=True)
    ghosted = models.BooleanField(default=False)

    def save(self, *args, **kwargs):
        print('saving')
        try:
            self.company.save()
        except:
            print('no company')
        super(User, self).save(*args, **kwargs)
...

2
尝试在已安装的应用程序中将“ledger”放在“django.contrib.auth”之前... - Raphael
1
@ChaseRoberts 问题出在哪里? - blue_zinc
1
还有其他人想出答案吗?我卡在这里了。 - bzupnick
1
在我的情况下,我的一个文件(models.py)中有一个 from django.contrib.auth import forms,其中调用了 get_user_model()。通过删除这些导入语句,问题得到解决。 - AlirezaAsadi
在我的情况下,这是一个循环导入的情况。永远不要在用户模型中导入另一个使用User模型本身的应用程序中的某个模型。这是新手错误。 - Arindam Roychowdhury
12个回答

12
我曾经遇到这个问题,通过正确理解Django字段的结构,最终得以解决。
教程中的指导通常存在差异且令人困惑。
你需要了解,在安装Django时有两个关键步骤:
1. 创建项目 2. 创建应用程序(app)
我们通过跟随官方Django教程来说明问题:
步骤1:创建新项目:https://docs.djangoproject.com/en/3.1/intro/tutorial01/ 注: 创建一个项目。
django-admin startproject mysite

现在你会发现有一个名为“mysite”的目录。

**步骤2:** 教程中指出: 要创建你的应用程序,请确保你在manage.py所在的同一目录中,然后输入以下命令: 该目录就是刚刚创建的,因此进入该目录:

cd mysite

如果你输入ls,那么你会在这个目录下看到:

  • 一个名为manage.py的文件
  • 令人困惑的是,另一个名为mysite的目录

第三步: 现在教程告诉你创建你的Django应用程序:

python manage.py startapp polls

现在,ls命令会显示这些文件:

manage.py
mysite
polls

可能会产生混淆,因为所有这些文件都在mysite目录下。

步骤4: 如果您想使用自定义用户模型,则官方建议在进行任何迁移之前立即开始项目。

好的,现在编辑mysite/settings.py文件,并添加以下行:

AUTH_USER_MODEL = 'polls.User'

然后编辑polls/models并添加以下内容:

from django.db import models

# Create your models here.

from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass

**步骤5:**现在进行第一次迁移就可以了,是吗?

python manage.py makemigrations

但 SPLAT!

Traceback (most recent call last):
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/apps/registry.py", line 156, in get_app_config
    return self.app_configs[app_label]
KeyError: 'polls'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/contrib/auth/__init__.py", line 157, in get_user_model
    return django_apps.get_model(settings.AUTH_USER_MODEL, require_ready=False)
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/apps/registry.py", line 206, in get_model
    app_config = self.get_app_config(app_label)
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/apps/registry.py", line 163, in get_app_config
    raise LookupError(message)
LookupError: No installed app with label 'polls'.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "manage.py", line 22, in <module>
    main()
  File "manage.py", line 18, in main
    execute_from_command_line(sys.argv)
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/core/management/__init__.py", line 377, in execute
    django.setup()
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/__init__.py", line 24, in setup
    apps.populate(settings.INSTALLED_APPS)
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/apps/registry.py", line 122, in populate
    app_config.ready()
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/contrib/admin/apps.py", line 24, in ready
    self.module.autodiscover()
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/contrib/admin/__init__.py", line 24, in autodiscover
    autodiscover_modules('admin', register_to=site)
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/utils/module_loading.py", line 47, in autodiscover_modules
    import_module('%s.%s' % (app_config.name, module_to_search))
  File "/usr/lib/python3.8/importlib/__init__.py", line 127, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1014, in _gcd_import
  File "<frozen importlib._bootstrap>", line 991, in _find_and_load
  File "<frozen importlib._bootstrap>", line 975, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 671, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 783, in exec_module
  File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/contrib/auth/admin.py", line 6, in <module>
    from django.contrib.auth.forms import (
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/contrib/auth/forms.py", line 21, in <module>
    UserModel = get_user_model()
  File "/opt/theapp/venv3.8/lib/python3.8/site-packages/django/contrib/auth/__init__.py", line 161, in get_user_model
    raise ImproperlyConfigured(
django.core.exceptions.ImproperlyConfigured: AUTH_USER_MODEL refers to model 'polls.User' that has not been installed
(venv3.8) ubuntu@ip-172-26-5-79:~/mysite$

错误提示如下:ImproperlyConfigured: AUTH_USER_MODEL 指向了未安装的模型 'polls.User'

我们可以通过修改 mysite/settings.py 文件来解决这个问题,具体步骤如下:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

转换为:

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'polls',
]

请注意,您需要添加的行是“polls”,这是您的Django应用程序的名称。
现在,请再试一次:
(venv3.8) ubuntu@ip-172-26-5-79:~/mysite$ python manage.py makemigrations
Migrations for 'polls':
  polls/migrations/0001_initial.py
    - Create model User
(venv3.8) ubuntu@ip-172-26-5-79:~/mysite$

成功了!!!

所以,这个长篇故事的要点是要明确Django必须知道你的Django应用程序在哪里。而告诉Django这一点的地方,在settings.py文件的INSTALLED_APPS中。

Django项目和Django应用程序之间的区别真的很令人困惑,而且通过建议创建两个同名目录来加剧了这种困惑。

为了使事情更加清晰,我建议你将Django项目名称后缀为“project”,将Django应用程序名称后缀为“app”,并且不要给顶级目录命名与项目相同的名称。

因此,要设置新项目:

(venv3.8) ubuntu@ip-172-26-5-79:~$ mkdir container
(venv3.8) ubuntu@ip-172-26-5-79:~$ cd container/
(venv3.8) ubuntu@ip-172-26-5-79:~/container$ django-admin startproject myproject .
(venv3.8) ubuntu@ip-172-26-5-79:~/container$ ls
manage.py  myproject
(venv3.8) ubuntu@ip-172-26-5-79:~/container$ python manage.py startapp myapp
(venv3.8) ubuntu@ip-172-26-5-79:~/container$ ls -lah
total 20K
drwxrwxr-x  4 ubuntu ubuntu 4.0K Oct 27 05:30 .
drwxr-xr-x 11 ubuntu ubuntu 4.0K Oct 27 05:29 ..
-rwxrwx---  1 ubuntu ubuntu  665 Oct 27 05:30 manage.py
drwxrwxr-x  3 ubuntu ubuntu 4.0K Oct 27 05:30 myapp
drwxrwxr-x  3 ubuntu ubuntu 4.0K Oct 27 05:30 myproject
(venv3.8) ubuntu@ip-172-26-5-79:~/container$

现在,当你处理Django网站和Django项目时,你将更清楚地区分它们,并且不会再因为存在多个同名目录而感到困惑。


4

我知道这是一个老问题,但在找到我的错误之前,我为此问题苦苦挣扎了两天,而我的错误是没有按照Django Models文档中的模型组织方式进行操作。

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

它需要在你的应用程序目录顶层的models.py文件中进行定义:

  • <app_name>/models.py
在一个包含__init__.py文件并导入您的模型的models /目录中:
  • <app_name>/models/<arbitrary_name>.py 存在一个包含行from .<arbitrary_name> import <custom_user><app_name>/models/__init__.py

目前你的回答不够清晰,请编辑并添加更多细节以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community
现在应该更清楚了。有什么具体不清楚的地方吗? - Joshua
1
谢谢!它解决了我的问题。 - Yoiro
很高兴听到有人觉得这对他们有帮助! - Joshua
@Joshua 如果我想要一个单一的应用程序,并使用模块来拆分我的代码,该怎么办?例如,拥有一个<app_name>/<module_name>/models.py的层次结构? - undefined
@DavidDahan 那么你需要在<app_name>/models.py中导入所有各个模块的models.py文件。 - undefined

3
在我的情况下,循环引用语句导致了OP提到的错误。这是我的有缺陷的代码:
custom_auth_app/models.py
...
from custom_auth_app import views.py
...
class CustomUser(AbstractUser):
    ...

与此同时,在custom_auth_app/views.py中:

from custom_auth_app import models
...
models.CustomUser.objects.all()

作为支持我的观点的第二个证据,在 custom_auth_app/models.py 中重新排列语句后,我没有收到错误信息。

...
class CustomUser(AbstractUser):
    ...
from custom_auth_app import views.py # won't cause an error
...

因此,这种循环导入阻止了CustomUser的加载,并引起了错误。

1
这就是为什么每个人都应该回来发布解决方案。这个答案救了我。我也遇到了循环导入的问题,但错误信息根本没有提到它!!! - mp035

3

我的声望不够高,无法在@Duke Dougal的解决方案上进行评论,因此我正在创建新的评论。

我也遇到了同样的问题,但以上所有解决方案都没有解决我的问题。最终我通过将我的应用程序(其中我有我的用户模型)移到INSTALLED APPS的最后一个位置(即所有其他应用程序之后)来解决它。所以像这样:

INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'my_other_app_1',
'my_other_app_2',
'polls', # <-- App with my custom User model

]


2

我知道这是一个很老的问题,但我觉得分享一下我的发现(我有多蠢!)。

在我的情况下,问题是我的自定义用户模型在Meta类中设置了abstract=True(当你复制基类代码以覆盖它时会发生:P)。


1
这个错误可能是由于其他应用程序加载失败而出现的,即使它与自定义用户模型无关。在我的情况下,我安装了“gcharts”应用程序,但需要与之一起安装google-visualization-python库。两者都与用户模型无关,但django仍会返回此错误。
以下步骤可以揭示您问题的真正根本原因:
1. 在settings.py中注释掉大部分应用程序,直到django启动。 2. 逐个添加应用程序,直到出现错误。

0

@Abhishek Dalvi的回答也帮了我。

class Meta:
    verbose_name = _('user')
    verbose_name_plural = _('users')
    abstract = True  # <-- this must be deleted if you create custom User

0
我的问题是我的自定义用户模型在Meta类中手动应用了错误的app_label。花了我3个小时才找出来!
# project/settings.py
INSTALLED_APPS += [
    "project.random_app",
    "project.user_app",   # app containing the custom user model
]
AUTH_USER_MODEL = "user_app.MyUser"

用户模型类中的错误:app_label

# project/user_app/models.py
class MyUser(Model):
    class Meta:
        app_label = "WRONG"  # must match an app in `installed_apps`

我通过移除 app_label 解决了这个问题,因为它实际上不是必需的。您也可以将其与应用程序名称匹配,但使用 user_app
在我的情况下,由于尝试修复相同的问题一段时间后得到了解决,并在推送之前进行了重新组织,因此出现了这种设置。

0
在我的情况下,问题是我导入了属于默认的User模型的某些内容。
# my_app/models.py
from django.db import models
from django.contrib.auth.forms import (UserCreationForm, UserChangeForm)  # Problematic line
from django.contrib.auth.models import AbstractUser


class CustomUser(AbstractUser):
    pass

UserCreationFormUserChangeForm实际上在它们的内部Meta类中设置了model = User,因此不能与自定义用户模型一起使用。一旦我删除了那行代码,makemigrations(以及其他manage.py命令)就可以正常工作。

我忘记了不能直接使用User表单与自定义用户模型一起使用,而应该对它们进行子类化,并在其内部Meta类中设置model = CustomUser。例如:

class CustomUserCreationForm(UserCreationForm):
    class Meta(UserCreationForm.Meta):
        model = CustomUser

提示:您不应该在 models.py 中导入或创建表单类,这很容易引起错误。 - Abdul Aziz Barkat

0

使用Django 3.1

我的问题非常简单,因为我正在使用开发设置。普通设置文件中已安装的应用程序缺少信息。


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