Django模型"没有声明一个明确的app_label"

Slb*_*box 92 python django python-3.x

我很快就结束了.经过十几个小时的故障排除,可能更多,我以为我终于在做生意了,但后来我得到了:

Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label 
Run Code Online (Sandbox Code Playgroud)

网上有这么简单的信息,没有解决方案解决了我的问题.任何建议都会非常感激.

我正在使用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',
]
Run Code Online (Sandbox Code Playgroud)

我的apps.py文件看起来像这样:

from django.apps import AppConfig


class DeletenoteConfig(AppConfig):
    name = 'DeleteNote'
Run Code Online (Sandbox Code Playgroud)

from django.apps import AppConfig


class LibrarysyncConfig(AppConfig):
    name = 'LibrarySync'
Run Code Online (Sandbox Code Playgroud)

Xeb*_*dee 69

您是否遗漏将应用程序名称输入设置文件?这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',
]
Run Code Online (Sandbox Code Playgroud)

这样,设置文件就会找出您要为应用程序调用的内容.您可以通过添加以下代码来更改它在apps.py文件中的显示方式

myAppName/apps.py

class myAppNameConfig(AppConfig):
    name = 'myAppName'
    verbose_name = 'A Much Better Name'
Run Code Online (Sandbox Code Playgroud)

  • @Xeberdee我尝试了所有这些,但仍然得到相同的错误,这是什么“import django django.setup()”以及我应该将它保存在哪里。 (3认同)
  • 感谢@xeberdee和@RemcoGerlich对此的帮助.最后,我的解决方案是将我的应用程序加载到django.contrib应用程序下面,并将我在settings.py中的`import django django.setup()`条目移动到`INSTALLED_APPS`条目下面. (2认同)
  • 出于好奇 - 为什么在设置文件中导入django django.setup()?此外,即使您的应用是已安装的应用列表中的第一个,也应加载您的应用. (2认同)
  • 这和他在问题中写的有什么区别? (2认同)

小智 26

我得到了同样的错误,我不知道如何找出这个问题.我花了很多时间才注意到我有一个与django的manage.py相同的init.py.

之前:

|-- myproject
  |-- __init__.py
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py
Run Code Online (Sandbox Code Playgroud)

后:

|-- myproject
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py
Run Code Online (Sandbox Code Playgroud)

很遗憾你得到这个"没有声明一个明确的app_label"错误.但删除此init文件解决了我的问题.

  • 天啊,我看了这个很久了——太棒了! (6认同)
  • 对于我来说,应用程序运行了文件,但单元测试失败了。运行测试时,使用“__init__.py”文件运行了 101 次测试,最后一次因导入错误而失败。删除 `__init__.py` 文件后,它运行了 100 次测试,全部通过。 (3认同)

Ben*_*doh 21

我遇到了类似的问题,但我能够通过在模型类中明确指定app_labelusing类来解决我的问题Meta

class Meta:
    app_label  = 'name_of_my_app'
Run Code Online (Sandbox Code Playgroud)


sta*_*eep 14

使用PyCharm运行测试时,我遇到了完全相同的错误.我通过显式设置DJANGO_SETTINGS_MODULE环境变量来修复它.如果您正在使用PyCharm,只需点击Edit Configurations按钮并选择Environment Variables.

将变量设置为your_project_name.settings应该修复的东西.

似乎发生了这个错误,因为PyCharm运行自己的测试manage.py.

  • 尽管通过 Pycharm 运行服务器不需要我添加设置,但运行 Pycharm 测试时遇到此问题。手动将 DJANGO_SETTINGS_MODULE 添加到配置以进行测试解决了我的问题。 (3认同)
  • 此外,在编辑配置时,编辑模板很有用。 (2认同)
  • Settings -> Languages & Frameworks -> Django -> 在 settings 下添加一个值会自动为每个新的 Django 和 Django 测试运行配置设置`DJANGO_SETTINGS_MODULE`。 (2认同)

luk*_*aus 13

我使用时得到了这个,./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()
Run Code Online (Sandbox Code Playgroud)


jul*_*sar 13

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

|-- myproject
    |-- manage.py
    |-- myproject
    |-- myapp
        |-- models.py  # defines model: MyModel
        |-- tests
            |-- test_models.py
Run Code Online (Sandbox Code Playgroud)

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

from models import MyModel
Run Code Online (Sandbox Code Playgroud)

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

from myapp.models import MyModel
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!

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

  • 我花了比预期更长的时间才找到这个。我在 test.py 文件中使用相对导入。使用“from .models import MyModel”时出现错误。更改为“from myapp.models import MyModel”解决了该问题。 (2认同)

Wre*_*cks 12

我刚才遇到了同样的问题.我通过在应用名称上添加命名空间来修复我的问题.希望有人觉得这很有帮助.

apps.py

from django.apps import AppConfig    

class SalesClientConfig(AppConfig):
        name = 'portal.sales_client'
        verbose_name = 'Sales Client'
Run Code Online (Sandbox Code Playgroud)


rps*_*stw 9

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

错误:

from someModule import someClass
Run Code Online (Sandbox Code Playgroud)

对:

from .someModule import someClass
Run Code Online (Sandbox Code Playgroud)

这种情况发生在几天前,但我真的无法重现它...我认为只有刚接触Django的人才会遇到这种情况.这就是我记得的:

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

from django.contrib import admin
from user import User
admin.site.register(User)
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

更改user.user,问题就解决了

  • 欢迎来到stackoverflow!我不得不提到你的回答与OP的问题无关.作为一个菜鸟,你应该小心提出解决方案,而不是先验证它们的正确性.但请继续回来,并在可以的时候发布具体答案 - 谢谢! (7认同)
  • 我希望 Stack 上的更多评论能像您对 Xeon Phil 的评论一样。很多时候,新用户会被狂热的评论者赶走,因为他们对自己在第一天就不是 Stack 专家感到不满。 (4认同)

ino*_*tia 6

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

    apps/
      myapp/
        models/
          __init__.py
          foo.py
          bar.py
Run Code Online (Sandbox Code Playgroud)

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

    from .foo import *
    from .bar import *
Run Code Online (Sandbox Code Playgroud)

在我的应用程序中,我像这样导入模型:

    from myapp.models import Foo, Bar
Run Code Online (Sandbox Code Playgroud)

这导致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 *
Run Code Online (Sandbox Code Playgroud)

这解决了错误。

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


小智 6

就我而言,发生这种情况是因为我在项目级urls.py中使用了相对模块路径,INSTALLED_APPSapps.py不是植根于项目根目录。即整个模块的绝对路径,而不是相对模块路径+ hacks。

无论我如何弄乱应用程序中的路径INSTALLED_APPSapps.py我都无法同时使用runserverpytest工作,直到所有三个都扎根于项目根目录。

文件夹结构:

|-- manage.py
|-- config
    |-- settings.py
    |-- urls.py
|-- biz_portal
    |-- apps
        |-- portal
            |-- models.py
            |-- urls.py
            |-- views.py
            |-- apps.py
Run Code Online (Sandbox Code Playgroud)

通过以下内容,我可以使用manage.py runserverwsgi 运行gunicorn并portal毫无问题地使用应用程序视图,但ModuleNotFoundError: No module named 'apps'尽管DJANGO_SETTINGS_MODULE配置正确,但 pytest 仍会出错。

配置/设置.py:

INSTALLED_APPS = [
    ...
    "apps.portal.apps.PortalConfig",
]
Run Code Online (Sandbox Code Playgroud)

biz_portal/apps/portal/apps.py:

class PortalConfig(AppConfig):
    name = 'apps.portal'
Run Code Online (Sandbox Code Playgroud)

配置/urls.py:

urlpatterns = [
    path('', include('apps.portal.urls')),
    ...
]
Run Code Online (Sandbox Code Playgroud)

将 config/settings.py 中的应用程序引用更改为并biz_portal.apps.portal.apps.PortalConfig允许pytest 运行(我还没有视图测试),但会出错PortalConfig.namebiz_portal.apps.portalportalrunserver

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

最后我 grepapps.portal看看什么仍然使用相对路径,并发现 config/urls.py 也应该使用biz_portal.apps.portal.urls.


小智 5

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

@Xeberdee 的所有内容都是正确的,因此请遵循并查看是否解决了问题,如果不是,这是我的问题:

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

class AlgoExplainedConfig(AppConfig):
    name = 'algo_explained'
    verbose_name = "Explain_Algo"
    ....
Run Code Online (Sandbox Code Playgroud)

我所做的只是在我的应用程序名称前面添加了项目名称,如下所示:

class AlgoExplainedConfig(AppConfig):
name = '**algorithms_explained**.algo_explained'
verbose_name = "Explain_Algo"
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题,之后我能够运行 makemigrations 和 migrate 命令!祝你好运


Rob*_*Rob 5

这里的答案都没有解决我的问题,而且将我们所有人带到这里的错误消息对我来说是一个转移注意力的事情 - 但我确实找到了解决方案。

对我来说,问题的真正原因是:

  • Django 尝试注册应用程序
  • 应用程序注册过程中出现一些异常(根本原因)
  • 异常处理工具中的某些内容会在某个地方引入模型
  • 该模型存在于尚未注册的应用程序中(因为,请记住,应用程序注册已被上面的根本原因异常破坏)
  • 最后,作为临死前的最后一幕,姜戈吐出了将我们大家带到这里的(转移注意力的)抱怨 - 即SomeModel doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

我不需要关心这个错误(即将我们所有人带到这里的错误),而是需要向上滚动并阅读第一条错误消息。

这对您来说可能看起来像其他东西,它可能是任何破坏应用程序注册的东西。对我来说,根本原因问题是:

Traceback (most recent call last):
[...SNIP...]                                                                                                                                                                                      
  File "/Users/user/.pyenv/versions/appName_py3/lib/python3.7/site-packages/django/__init__.py", line 24, in setup                   
    apps.populate(settings.INSTALLED_APPS)                                                                                         
  File "/Users/user/.pyenv/versions/appName_py3/lib/python3.7/site-packages/django/apps/registry.py", line 114, in populate 
    app_config.import_models()                                                                                                       
[... SNIP ...]                                                                                                    
  File "/Users/user/app_name/api/models/models.py", line 1122, in <module>              
    class SomeObject(models.Model):                                                                                     
  File "/Users/user/dev_alt/app_name/api/models/models.py", line 1134, in SomeObject
    some_property = models.ForeignKey(SomeOtherObject, null=True, blank=True)                         
TypeError: __init__() missing 1 required positional argument: 'on_delete'   

[...SNIP...]
During handling of the above exception, another exception occurred:

<RED HERRING STACK TRACE THAT BROUGHT US ALL HERE>
Run Code Online (Sandbox Code Playgroud)

同样,“根本原因”问题对您来说可能有所不同 - 但对我来说:我正在将旧版 Django 应用程序从 1.11.x 升级到 3.2.x。在此过程中,Django 做出了一个破坏向后兼容性的更改,要求模型上的所有ForeignKey和属性都有一个参数。OneToOneon_delete

我在应用程序中为 200 多个违规案例添加了这个论点,并且我的根本原因问题和问题都doesn't declare an explicit app_label得到了解决。

  • 这节省了我几个小时的故障排除时间。谢谢@罗布! (2认同)