Python AUTH_USER_模型是指尚未安装的模型

Python AUTH_USER_模型是指尚未安装的模型,python,django,django-authentication,django-settings,Python,Django,Django Authentication,Django Settings,我犯了一个错误 ImproperlyConfigured at /admin/ AUTH_USER_MODEL refers to model 'ledger.User' that has not been installed 我只在我的生产服务器上获取它。当我通过本地主机运行时就不会了。首先,我只是在提出某种要求的时候。然后我认为我的数据库一定是不同步的,所以我删除了所有的表,然后运行manage.py syncdb。现在,它似乎已经传播,甚至向管理员抛出了错误 我以前从未见过这种错误,也不

我犯了一个错误

ImproperlyConfigured at /admin/
AUTH_USER_MODEL refers to model 'ledger.User' that has not been installed
我只在我的生产服务器上获取它。当我通过本地主机运行时就不会了。首先,我只是在提出某种要求的时候。然后我认为我的数据库一定是不同步的,所以我删除了所有的表,然后运行manage.py syncdb。现在,它似乎已经传播,甚至向管理员抛出了错误

我以前从未见过这种错误,也不知道这是怎么回事。我已经在settings.py中定义了AUTH_USER_模型:

...
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)
...

如果您的任何其他应用无法加载,则会出现此错误,即使它与自定义用户模型无关。在我的例子中,我安装了“gcharts”应用程序,但需要安装google可视化python库。两者都与用户模型无关,但django无论如何都返回了此错误

以下内容应揭示问题的真正根源:

  • 在settings.py中注释掉大部分应用程序,直到django启动
  • 每次添加一个应用程序,直到出现错误

    • 我知道这是一个非常古老的问题,但我想分享我的发现(我有多愚蠢!)。


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

      我遇到了这个问题,通过正确理解Django字段的结构,它得到了解决

      教程中的说明通常是不同的和令人困惑的

      您需要了解,在安装Django时,有两个关键步骤:

      1:创建项目 2:创建应用程序(应用程序)

      让我们按照Django官方教程说明这个问题:

      步骤1:创建新项目:

      django-admin startproject mysite
      
      现在您将发现有一个名为“mysite”的目录

      **步骤2:** 教程说: 要创建应用程序,请确保您与manage.py位于同一目录中,然后键入以下命令: 这是刚刚创建的目录,请转到:

      cd mysite
      
      如果您是ls,您将在该目录中找到: 名为manage.py的文件 令人困惑的是,另一个名为mysite的目录

      第三步: 现在,本教程介绍如何创建django应用程序:

      python manage.py startapp polls
      
      现在ls显示这些文件: manage.py
      mysite
      民意测验

      Consufion可能现在就开始了,因为所有这些文件都在mysite目录下

      第4步: 如果您想使用自定义用户模型,那么官方建议是在进行任何迁移之前,在项目开始时就使用自定义用户模型

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

      AUTH_USER_MODEL='polls.USER'

      和编辑轮询/模型并添加:

      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
      
      但是,斯普莱特

      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$
      
      为此:

      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文件中已安装的应用程序

      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项目时,您将更加清楚,您将不再被多个同名目录所迷惑。

      没有足够的代表对@Duke Dougal solution发表评论,因此我正在创建一个新的评论

      我也有同样的问题,但上述解决方案都不适合我。最终通过将我的应用程序(我有我的用户模型)移动到已安装应用程序的最末端(即使在我的所有其他应用程序之后)来修复它。比如说:

      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
      
      已安装的应用程序=[
      “django.contrib.admin”,
      “django.contrib.auth”,
      “django.contrib.contenttypes”,
      “django.contrib.sessions”,
      “django.contrib.messages”,
      “django.contrib.staticfiles”,
      “我的其他应用程序1”,
      “我的其他应用程序2”,
      
      “民意测验”#在你安装的应用程序中,试着在“django.contrib.auth”之前加上“ledger”…自从我发布了这个问题后,我想出了一个答案。但我忘了回来写问题是什么。真丢脸。我希望我能否决你。@ChaseRoberts问题是什么?还有人想出答案吗?我被困在这个问题上了。
      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