运行时错误:模型类django.contrib.sites.models.Site没有声明明确的app_label,并且不在INSTALLED_APPS中的应用程序中。

108
我正在使用Django Rest Framework和AngularJs构建一个应用程序。我正在使用Django-rest-auth进行身份验证,但是我还没有能够设置它。无论如何,我正在尝试在我的项目中设置此app。我意识到我需要安装django-rest-auth-registration才能运行它,因此我按照这个文档做了以下事情:
我运行了以下命令

pip install django-rest-auth

pip install django-allauth

我的settings.py看起来像这样:
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    # 3rd party apps
    'rest_framework',
    'rest_framework.authtoken',
    'rest_auth',
    'allauth',
    'allauth.account',
    'rest_auth.registration',

    # My app
    'myapp',
]

我还添加了身份验证后端、上下文处理器和正确的URL。
然而,当我尝试迁移时,终端会抛出以下错误:
“运行时错误: 模型类django.contrib.sites.models.Site没有声明明确的app_label,也不在INSTALLED_APPS中的应用程序中。”
我为什么会得到这个错误,如何解决它以便迁移我的项目?谢谢!

这个回答解决了你的问题吗?Django模型“没有声明明确的app_label” - Qumber
我发现问题出在settings.py中没有为新创建的应用程序包含应用程序定义。在INSTALLED_APPS中添加'<app>.apps.<AppConfig>'后,Django就能够理解它是一个已注册的应用程序了。 - Tanner Dolby
11个回答

266

解决方法

只需将Django的Sites framework添加到您的应用程序中,并在设置中将SITE_ID设置为1。在INSTALLED_APPS设置中,将其列在依赖库之前。

INSTALLED_APPS = [
    'django.contrib.sites',
    ...
]

SITE_ID = 1

为什么会发生这种情况? Django的站点框架是与核心库捆绑在一起的一个贡献模块,它允许使用单个Django应用程序/代码库来处理不同的站点(可以使用不同的数据库、视图中的逻辑等)。正如文档中所述,SITE_ID设置“用于使应用程序数据能够连接到特定的站点,并且单个数据库可以管理多个站点的内容”。
在这种特殊情况下,AllAuth需要使用站点框架才能正常运行。许多其他第三方库都被设计成能够安全处理可能存在多个站点的情况,因此可能是最佳选择。

1
它修复了问题,但它来自哪里? - erikbstack
1
Django的站点框架是一个捆绑在核心库中的贡献模块,允许使用单个Django应用程序/代码库与不同的站点(可以使用不同的数据库、视图逻辑等)。在这种特殊情况下,AllAuth需要站点框架才能正常运行(许多其他第三方库也是如此,旨在安全地处理可能存在多个站点的情况)。 - Ian Price
在2018年,您不再需要SITE_ID,但我仍然遇到了这个问题。 - holms
15
尽管我使用了'django.contrib.sites'和SITE_ID = 1,但我仍然遇到了这个问题。 - Ross Symonds
检查回溯信息,你会看到是哪个第三方应用程序试图使用django.contrib.sites模块。在我的情况下,是userena。 - ming
如果有人需要帮助,我在INSTALLED_APPS中同时拥有'django.contrib.sites'和SITE_ID = 1,但仍然出现错误,所以我改变了应用程序的顺序,将新添加的应用程序移到底部,然后它就可以工作了。 - Arislan Makhmudov

9

我通过谷歌搜索找到了这篇文章。我的问题是运行测试时出现了以下错误:

RuntimeError: Model class app.taxonomy.models.Term doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

这是在使用Python 2.7.x和绝对引用时运行的代码。正如评论中Colton Hicks所提到的,在Python 3 (pytest 3.2.3与Django 1.11.4)中也可能会发生这种情况。
在我的`tests.py`文件中:
from __future__ import absolute_import
[...]
from .models import Demographics, Term

在将相对导入更改为绝对导入后,问题消失了:
from taxonomy.models import Demographics, Term

HTH


遇到了类似的问题,但是我使用的是 Python3。在我的 tests.py 文件中,我用了一个相对引入想要测试的视图 from .views import LatestAccount。我得到的错误不是 tests.py 文件中使用的模型的错误。但是,删除相对引入并用绝对引入替换解决了这个问题。 - user1847
@ColtonHicks 这是使用哪个测试运行器发生的问题?我会将你的Python3发现添加到我的答案中。 - berto
我在一个Django 1.11.4应用程序中使用pytest 3.2.3。 - user1847

4

我安装了Django的调试工具栏(debug toolbar),但实际上这正是导致问题的原因。 在settings.py中的INSTALLED_APPS中需要添加'django.contrib.sessions'。添加后请确保运行迁移命令。


3

尝试在模型的元类中添加app_label = 'yourApp'

class Meta:

    app_label = 'yourApp'

我的显示了一个不同的错误:运行时错误:应用程序'odin'中存在冲突的'uploadedcsvfile'模型:<class 'splitter.models.UploadedCSVFile'>和<class 'app.splitter.models.UploadedCSVFile'>。其中,odin是您的应用程序名称,UploadedCSVFile是模型名称。您知道为什么会出现这种情况吗? - AlphaCR
没有看到你的代码很难说。但从错误来看,我想你可能有多个同名模型? - PowerAktar

2
我遇到了上面的错误。然而,我的问题在于urls.py文件中。我正在按照PyDanny cookiecutter django配方进行操作。我的错误是在urls.py文件中加入了以下这行代码:
    url(r'^demo/', include('project.demoapp.urls', namespace='demoapp')),

当我更正为这个时候:
    url(r'^demo/', include('demoapp.urls', namespace='demoapp')),

一切都很顺利。我还更改了本地应用程序(这是我首先做的,所以致命错误是URL配置不正确):

LOCAL_APPS = [
    # Your stuff: custom apps go here
    'demoapp.apps.DemoAppConfig',
]

1
只需将'django.contrib.sites',添加到INSTALLED_APPS中,并在settings.py文件中设置SITE_ID = 1即可。

添加 django.contrib.sites 对我很有帮助,谢谢。 - Aanish Amir Waseem

1

Django 4.1+ (2023)

经过近一个小时的挖掘,我找到了解决方法:

INSTALLED_APPS = [
    ...
    'django.contrib.sessions',
]

不需要 SITE_ID 或额外的 INSTALLED_APPS 条目。


1

Django>=4.0的升级答案 // 2022

将Django的Sites框架和FlatPages框架添加到您的INSTALLED_APPS中,并在设置中设置SITE_ID。

INSTALLED_APPS = [
    ...
    'django.contrib.sites',
    'django.contrib.flatpages',

]

SITE_ID = 1

您的测试应该像魔术一样顺畅


对我不起作用,Django 4.1。 - Bersan

1
这个错误消息通常发生在Django遇到一个模型类时,该模型类没有明确定义的app_label,并且没有包含在你的Django项目设置中的INSTALLED_APPS列表中。
要解决这个问题,你可以按照以下步骤进行操作:
打开你的Django项目的设置文件(settings.py)。 找到INSTALLED_APPS列表,其中应包含你项目中所有已安装应用的名称。 确保'django.contrib.sessions'应用程序包含在INSTALLED_APPS列表中。 INSTALLED_APPS = [ # ... 'django.contrib.sessions', # ... ]
如果你发现 'django.contrib.sessions' 丢失了,就像上面展示的那样将它添加到列表中并保存文件。 如果该应用程序已经包含在 INSTALLED_APPS 列表中,但仍然遇到错误,可能是项目配置的另一个问题。在这种情况下,值得验证你是否安装了正确版本的 Django 及其依赖项,因为兼容性问题有时会导致此类错误。
此外,如果你有自定义的模型类没有明确定义 app_label 属性,你应该为这些模型类添加 app_label 属性。例如:
class Session(models.Model):
    # model fields
    class Meta:
        app_label = 'sessions'

通过指定app_label属性,您明确声明了模型类的应用标签,这有助于Django正确地定位和识别它。请将'sessions'替换为您的应用程序的适当标签。
记得在对设置文件进行任何更改后重新启动Django开发服务器,以确保修改生效。

0
这个错误是因为我为另一个功能相关的一些站点创建了一个新的应用程序文件夹。这需要在我的settings.py中添加到INSTALLED_APPS中。

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