Django模型“未声明显式的app_label”


119

我机智的结束了。经过十多个小时的故障排除(可能还有更多),我认为自己终于可以从事业务了,但是后来我得到了:

Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label 

网络上对此信息很少,目前还没有解决方案解决了我的问题。任何建议将不胜感激。

我正在使用Python 3.4和Django 1.10。

在我的settings.py中:

INSTALLED_APPS = [
    'DeleteNote.apps.DeletenoteConfig',
    'LibrarySync.apps.LibrarysyncConfig',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

我的apps.py文件如下所示:

from django.apps import AppConfig


class DeletenoteConfig(AppConfig):
    name = 'DeleteNote'

from django.apps import AppConfig


class LibrarysyncConfig(AppConfig):
    name = 'LibrarySync'

2
您在INSTALLED_APPS中没有django.contrib.contenttypes。
RemcoGerlich '16

2
然后另一件事是您在加载模型之前导入了它,是否有某些应用在使用它的INSTALLED_APPS中的内容类型之前列出了它?
RemcoGerlich '16

1
这很不寻常,您根本没有自己的项目或应用程序?
RemcoGerlich '16

1
所有具有models.py的内容都应位于INSTALLED_APPS中;并且如果其中之一使用contenttype(例如,由于使用通用外键),则它必须位于列表中的contenttype下。
RemcoGerlich '16

1
令人沮丧的是,这可能很小,但是很难从这里分辨出来。您是否将任何东西导入settings.py左右?
RemcoGerlich '16

Answers:


91

您是否缺少将应用程序名称放入设置文件中的信息?这myAppNameConfig.manage.py createapp myAppName命令在apps.py生成的默认类。其中myAppName是您的应用程序的名称。

settings.py

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

这样,设置文件可以找出您要调用的应用程序。您可以通过在以下代码中添加以下代码来更改apps.py文件中的外观:

myAppName / apps.py

class myAppNameConfig(AppConfig):
    name = 'myAppName'
    verbose_name = 'A Much Better Name'

好的,这对于我的示例来说非常有意义,并且我现在已经基于对语法的理解实现了更改,但是我仍然遇到了100%完全相同的错误。我已经更新了我的帖子以进行详细说明。
Slbox

2
感谢@xeberdee和@RemcoGerlich在此方面的帮助。最后,我的解决方案是将我的应用程序加载到django.contrib应用程序下方,并将我import django django.setup()在settings.py中的INSTALLED_APPS输入项移至该条目的下方。
Slbox

2
出于好奇-为什么在设置文件中导入django django.setup()?另外,即使您的应用程序是已安装应用程序列表中的第一个应用程序,也应加载。
Xeberdee

1
这和他在问题中写的有什么区别?
马特D

1
关键是如何通过设置文件中类的名称字段在设置INSTALLED_APPS中发现该应用程序。该帖子已被编辑。
Xeberdee

34

我收到相同的错误,但我不知道如何解决此问题。我花了很多时间才注意到,我有一个与django的manage.py相同的initcopy文件。

之前:

|-- myproject
  |-- __init__.py
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py

后:

|-- myproject
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py

您会收到此“未声明显式app_label”错误,这非常令人困惑。但是删除此初始化文件解决了我的问题。


2
神圣的烟,我一直在看这个很长的时间-好极了!
user3167654

我正在尝试使用pydoc生成文档,并且我的应用程序没有使用init.py进行隐藏
Serg Smyk,

20

使用PyCharm运行测试时,我遇到了完全相同的错误。我已经通过显式设置DJANGO_SETTINGS_MODULE环境变量来修复它。如果您使用的是PyCharm,只需点击编辑配置按钮,然后选择环境变量

将变量设置为your_project_name.settings,这应该可以解决问题。

似乎发生此错误,因为PyCharm使用自己的运行测试manage.py


1
尽管通过Pycharm运行服务器不需要我添加设置,但是在运行Pycharm测试时出现了此问题。手动将DJANGO_SETTINGS_MODULE添加到配置中以进行测试是否对我有利。
PhoebeB

1
另外,在编辑配置时,编辑模板很有用。
YngveHøiseth18年

1
设置->语言和框架-> Django->在设置下添加值将为DJANGO_SETTINGS_MODULE每个新的Django和Django测试运行配置自动设置。
Tobias Ernst

仅供参考,我完全按照此解决方案的指示进行操作,并且第一次无法使用。事实证明,PyCharm没有保存DJANGO_SETTINGS_MODULE第一次当我点击Apply然后OK。我第二次做了,现在可以了。似乎有点PyCharm怪异。
MikeyE

我必须确保正确声明了导入:from <app>.<module> import <class>-PyCharm自动导入丢失了<app>。一旦我纠正了这个问题(还检查了相关模块),它就可以正常工作。
Matthew Hegarty,

18

我在使用时得到了这个,./manage.py shell 然后我不小心从根项目级别目录中导入了

# don't do this
from project.someapp.someModule import something_using_a_model
# do this
from someapp.someModule import something_using_a_model

something_using_a_model()

就我而言,我不得不从更改from fields import xfrom .fields import x
daigorocub

13

作为使用Python3的菜鸟,我发现它可能是导入错误而不是Django错误

错误:

from someModule import someClass

对:

from .someModule import someClass

这种情况发生在几天前,但我真的无法复制它...我认为只有Django新手才可能遇到这种情况。

尝试在admin.py中注册模型:

from django.contrib import admin
from user import User
admin.site.register(User)

尝试运行服务器,错误看起来像这样

some lines...
File "/path/to/admin.py" ,line 6
tell you there is an import error
some lines...
Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label

更改user.user,问题已解决


9
欢迎来到stackoverflow!我不得不提到您的回答与OP的问题无关。作为菜鸟,您应该小心地提出解决方案,而无需先验证其正确性。但是请继续回来,并在可能的时候发布具体答案,谢谢!
evadeflow

1
我希望关于Stack的更多评论像您的Xeon Phil一样。狂躁的评论员常常为新用户感到沮丧,他们不满意自己不是第一天的Stack专家。
Slbox

1
您是对的,@evadeflow,我的第一个答案看起来确实无关,我试图澄清答案。无论如何,只是希望答案可能有用。
rpstw

就我而言,这是一个类似的问题。“从..core.models导入CommonInfo”必须成为“从apps.core.models导入CommonInfo”
user42488

这是我的问题,因为它在2个单独的文件中发生而被掩盖了。当当,嵌套进口!当你,我愚蠢地拒绝2to3明智的改变!
9999

13

我刚才有同样的问题。我通过在应用程序名称上添加名称空间来修复我的问题。希望有人觉得这有帮助。

apps.py

from django.apps import AppConfig    

class SalesClientConfig(AppConfig):
        name = 'portal.sales_client'
        verbose_name = 'Sales Client'

8

我在测试中导入模型时遇到此错误,即鉴于此Django项目结构:

|-- myproject
    |-- manage.py
    |-- myproject
    |-- myapp
        |-- models.py  # defines model: MyModel
        |-- tests
            |-- test_models.py

test_models.pyMyModel以这种方式导入的文件中:

from models import MyModel

如果以这种方式导入,则问题已解决:

from myapp.models import MyModel

希望这可以帮助!

PS:也许这有点晚了,但是在我的代码中没有其他人找到如何解决此问题的答案,我想分享我的解决方案。


juliocesar你是冠军。谢谢。这是一个荒谬的错误。
柯克

2
花了我比预期更长的时间找到了这个。我在test.py文件中使用了相对导入。使用时出现错误from .models import MyModel。进行更改以from myapp.models import MyModel解决此问题。
星期一

@monkut在这里一样。我不知道为什么会这样。顺便说一下,我使用自定义应用程序文件夹。项目根目录中的“ / apps”,添加到路径中。

4

在继续遇到这个问题并继续回到这个问题之后,我想我会分享我的问题所在。

@Xeberdee正确的所有内容,请按照以下说明操作,看看是否可以解决问题,如果不是,这是我的问题:

在我的apps.py中,这就是我拥有的:

class AlgoExplainedConfig(AppConfig):
    name = 'algo_explained'
    verbose_name = "Explain_Algo"
    ....

我所做的就是在我的应用名称之前添加了项目名称,如下所示:

class AlgoExplainedConfig(AppConfig):
name = '**algorithms_explained**.algo_explained'
verbose_name = "Explain_Algo"

这样就解决了我的问题,之后我就可以运行makemigrations和migration命令!祝好运


3

我今天在尝试运行Django测试时遇到此错误,因为我from .models import *在其中一个文件中使用了速记语法。问题是我的文件结构如下:

    apps/
      myapp/
        models/
          __init__.py
          foo.py
          bar.py

models/__init__.py我使用速记语法导入模型时:

    from .foo import *
    from .bar import *

在我的应用程序中,我正在导入如下模型:

    from myapp.models import Foo, Bar

这导致了Django model doesn't declare an explicit app_label运行时./manage.py test

要解决此问题,我必须从完整路径中显式导入models/__init__.py

    from myapp.models.foo import *
    from myapp.models.bar import *

那解决了错误。

H / t https://medium.com/@michal.bock/fix-weird-exceptions-when-running-django-tests-f58def71b59a


这也是我的问题。谢谢!
Sam Creamer

3

就我而言,这是因为我在项目级urls.py中使用了相对模块路径,INSTALLED_APPSapps.py不是植根于项目根目录中。即,绝对模块路径始终存在,而不是相对模块路径+ hack。

无论我在应用程序中INSTALLED_APPSapps.py应用程序中弄乱了多少,我都无法同时使用它们runserverpytest直到这三个都植根于项目根目录为止。

资料夹结构:

|-- manage.py
|-- config
    |-- settings.py
    |-- urls.py
|-- biz_portal
    |-- apps
        |-- portal
            |-- models.py
            |-- urls.py
            |-- views.py
            |-- apps.py

用下面的,我可以运行manage.py runserver,并与WSGI和使用gunicorn portal应用看法,并没有麻烦,但pytest将与错误ModuleNotFoundError: No module named 'apps',尽管DJANGO_SETTINGS_MODULE被正确配置。

config / settings.py:

INSTALLED_APPS = [
    ...
    "apps.portal.apps.PortalConfig",
]

biz_portal / apps / portal / apps.py:

class PortalConfig(AppConfig):
    name = 'apps.portal'

config / urls.py:

urlpatterns = [
    path('', include('apps.portal.urls')),
    ...
]

改变应用程序的参考配置/ settings.py来biz_portal.apps.portal.apps.PortalConfigPortalConfig.namebiz_portal.apps.portal允许pytest来运行(我没有做检查portal的意见还),但runserver将与错误

RuntimeError:模型类apps.portal.models.Business没有声明显式的app_label,并且不在INSTALLED_APPS中的应用程序中

最后,我摸索apps.portal着查看仍然在使用相对路径的内容,并发现config / urls.py也应该使用biz_portal.apps.portal.urls


用相对路径乱砍............做同样的事情。您的见解对我帮助很大
zar3bski

2

当我尝试为单个应用生成迁移时遇到了此错误,该应用由于git合并而存在现有的格式错误的迁移。例如

manage.py makemigrations myapp

当我删除它的迁移然后运行:

manage.py makemigrations

不会发生该错误,并且迁移成功生成。


谢谢。迁移继续令人沮丧。
HashRocketSyntax

2

我有一个类似的问题,但是我可以通过在模型类中使用Meta类明确指定app_label来解决我的问题

class Meta:
    app_label  = 'name_of_my_app'

谢谢本杰明!在我的Django项目中,我使用Sphinx生成文档,并且:: autoclass指令给出“ app_label”错误,直到按照您的建议将其添加到Model的Meta类中为止。
Stefan Musarra

很高兴它为您服务
本杰明·安多


1

我只是遇到了这个问题,并弄清楚出了什么问题。由于以前没有答案描述发生在我身上的问题,因此我将其发布给其他人:

  • 问题出python migrate.py startapp myApp在我的项目根文件夹中,然后将myApp移到一个子文件夹中mv myApp myFolderWithApps/
  • 我写了myApp.models并运行 python migrate.py makemigrations。一切顺利。
  • 然后我对另一个从myApp导入模型的应用做了同样的操作。b!执行迁移时,我遇到了这个错误。那是因为我不得不使用myFolderWithApps.myApp引用我的应用程序,但是我却忘记了更新MyApp / apps.py。因此,我在第二个应用程序中更正了myApp / apps.py,设置/ INSTALLED_APPS和导入路径。
  • 但是随后错误不断发生:原因是我进行了迁移,试图使用错误的路径从myApp导入模型。我试图更正迁移文件,但我发现重置数据库和删除迁移从头开始更容易。

简而言之:-问题最初是由于myApp的apps.py,第二个应用程序的设置和导入路径中错误的应用程序名称引起的。-但这不足以更正这三个位置的路径,因为迁移是使用导入引用了错误的应用程序名称创建的。因此,相同的错误在迁移过程中始终发生(这次迁移除外)。

所以...请检查您的迁移情况,祝您好运!


1

在Django rest_framework中构建API时遇到类似的错误。

RuntimeError:模型类apps.core.models.University未声明显式> app_label,并且不在INSTALLED_APPS中的应用程序中。

luke_aus的答案通过纠正我的问题帮助了我 urls.py

from project.apps.views import SurgeryView

from apps.views import SurgeryView

对我而言,我将其隐藏在迁移中。不知道怎么回事,但是删除项目名称/路径可以解决问题。
Michael Thompson

1

就我而言,将代码从Django 1.11.11移植到Django 2.2时出现此错误。我正在定义一个自定义FileSystemStorage派生类。在Django 1.11.11中,我在models.py中包含以下行:

from django.core.files.storage import Storage, DefaultStorage

后来在文件中,我有了类定义:

class MyFileStorage(FileSystemStorage):

但是,在Django 2.2中,我需要FileSystemStorage在导入时显式引用类:

from django.core.files.storage import Storage, DefaultStorage, FileSystemStorage

和贴吧,错误消失了。

请注意,每个人都在报告Django服务器随地吐痰的错误消息的最后一部分。但是,如果向上滚动,则会在该错误的中间部分找到原因。


1

就我而言,我能够找到一个修复程序,并且通过查看其他人的代码也可能是相同的问题。文件。

希望这对某人有帮助。这是我对编码社区的第一个贡献


1

TL; DR:添加空白__init__.py为我解决了此问题。

我在PyCharm中遇到此错误,并意识到我的设置文件根本没有被导入。没有明显的错误告诉我,但是当我在settings.py中放入一些废话时,它没有引起错误。

我在local_settings文件夹中有settings.py。但是,我希望在同一文件夹中包含__init__.py以便导入。一旦我添加了这个,错误就消失了。


1

如果所有配置正确,则可能只是导入混乱。密切关注您如何导入违规模型。

以下无效from .models import Business。请使用完整的导入路径:from myapp.models import Business


1

如果所有其他方法均失败,并且在尝试导入PyCharm“ Python控制台”(或“ Django控制台”)时遇到此错误:

尝试重新启动控制台。

这真是令人尴尬,但是花了我一段时间我才意识到自己忘记这样做了。

这是发生了什么:

添加了一个新的应用程序,然后添加了一个最小模型,然后尝试在Python / Django控制台中导入模型(PyCharm pro 2019.2)。这引发了doesn't declare an explicit app_label错误,因为我没有将新应用添加到中INSTALLED_APPS。因此,我将应用添加到了INSTALLED_APPS,再次尝试了导入,但是仍然遇到相同的错误。

来到这里,阅读所有其他答案,但似乎没有合适的答案。

最后,令我惊讶的是,在将新应用添加到后,我还没有重新启动Python控制台INSTALLED_APPS

注意:在将新对象添加到模块后,无法重新启动PyCharm Python控制台也是一种使人非常困惑的好方法 ImportError: Cannot import name ...


感谢您的答复,我忘记了提供.env文件的源头,我正在尽力使过时的配置正常工作:/
sodimel

1

O ... M ... G我也遇到了这个错误,我花了将近2天的时间,现在终于设法解决了。老实说...错误与问题无关。就我而言,这只是语法问题。我试图独立运行一个在django上下文中使用某些django模型的python模块,但该模块本身不是django模型。但是我宣布全班不对

而不是

class Scrapper:
    name = ""
    main_link= ""
    ...

我在做

class Scrapper(Website):
    name = ""
    main_link= ""
    ...

这显然是错误的。该消息是如此令人误解,以至于我忍不住想,但我认为这是配置方面的问题,或者只是以错误的方式使用django,因为我对此很陌生。

我将在这里与新手分享,因为我经历同样的愚蠢期盼能解决他们的问题。


0

SECRET_KEY从环境变量中移出并在运行应用程序时忘记对其进行设置后,收到了此错误。如果你有这样的事情settings.py

SECRET_KEY = os.getenv('SECRET_KEY')

然后确保您实际上在设置环境变量。


0

很可能您有依赖进口

在我的情况下,我在模型中使用了序列化程序类作为参数,而序列化程序类则在使用以下模型:serializer_class = AccountSerializer

from ..api.serializers import AccountSerializer

class Account(AbstractBaseUser):
    serializer_class = AccountSerializer
    ...

并在“序列化器”文件中:

from ..models import Account

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = (
            'id', 'email', 'date_created', 'date_modified',
            'firstname', 'lastname', 'password', 'confirm_password')
    ...

0

我今天遇到了这个错误,并在谷歌搜索后最终到达了这里。现有的答案似乎都与我的情况无关。我唯一需要做的就是从__init__.py应用程序顶层的文件中导入模型。我必须使用模型将导入移动到函数中。

Django似乎有一些奇怪的代码,在许多不同的情况下都可能会失败!


0

我今天也遇到了这个错误。该消息引用了INSTALLED_APPS我的应用程序中的某些特定应用程序。但实际上,它与此特定的应用程序无关。我使用了一个新的虚拟环境,却忘记安装一些在该项目中使用的库。在我安装了附加库之后,它开始工作了。


0

对于PyCharm用户:使用“不干净”的项目结构时出现错误。

是:

project_root_directory
└── src
    ├── chat
       ├── migrations
       └── templates
    ├── django_channels
    └── templates

现在:

project_root_directory
├── chat
   ├── migrations
   └── templates
       └── chat
├── django_channels
└── templates

这里有很多好的解决方案,但是我认为,首先,您应该在设置之前清理项目结构或调整PyCharm Django设置 DJANGO_SETTINGS_MODULE变量等。

希望对别人有帮助。干杯。


-1

问题是:

  1. 您已经对模型文件进行了修改,但尚未将其添加到数据库中,但是您正在尝试运行Python manage.py runserver。

  2. 运行Python manage.py makemigrations

  3. Python manage.py迁移

  4. 现在,Python manage.py runserver和一切都应该没问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.