Django模型“没有声明明确的app_label”。

241
经过十几个小时的故障排除,我以为终于可以开始工作了,但是接着我遇到了这个问题:
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'

3
你的 INSTALLED_APPS 中没有安装 django.contrib.contenttypes。 - RemcoGerlich
3
另一个可能性是在其模型加载之前导入了它,是否有某个应用程序在INSTALLED_APPS中排在contenttypes之前并使用它? - RemcoGerlich
1
这很不寻常,你完全没有自己的项目或应用程序吗? - RemcoGerlich
3
所有包含models.py的内容都应该在INSTALLED_APPS中;如果其中一个使用了contenttype(例如由于通用外键),那么它需要在列表中放在contenttypes下面。 - RemcoGerlich
1
不用谢,玩得开心 :) - RemcoGerlich
显示剩余14条评论
36个回答

165

您是否忘记在设置文件中添加应用程序名称?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',
]

这样,设置文件就知道你想叫什么名字的应用程序。你可以在以后的myAppName/apps.py文件中通过添加以下代码来更改其外观。

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

5
感谢 @xeberdee 和 @RemcoGerlich 的帮助。最终我的解决方案是将我的应用程序加载到 django.contrib 应用程序之下,并将 import django django.setup() 的条目移动到设置文件 settings.py 中 INSTALLED_APPS 条目之后。 - Slbox
2
仅出于好奇-为什么在设置文件中导入django django.setup()? 另外,即使它们是已安装应用程序列表中的第一个,您的应用程序也应该可以加载。 - Xeberdee
2
这与他在问题中写的有什么区别? - Matt
1
重点是如何通过配置文件中类的名称字段,在设置的INSTALLED_APPS中发现应用程序。该帖子已被编辑。 - Xeberdee
3
@Xeberdee我尝试了所有这些方法,但仍然得到相同的错误。请问import django django.setup()是什么意思?我应该在哪里放置它? - Rahul Verma
显示剩余4条评论

93
我遇到了同样的错误,但我不知道如何解决这个问题。花了我很多时间才注意到我在Django的同一目录下有一个__init__.py文件,就在manage.py的旁边。
之前:
|-- myproject
  |-- __init__.py  <---
  |-- manage.py
  |-- myproject
    |-- ...
  |-- app1
    |-- models.py
  |-- app2
    |-- models.py

之后:

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

这个没有明确声明app_label的错误让人感到困惑。但是删除这个__init__.py文件解决了我的问题。

我正在尝试使用pydoc生成文档,但我的应用程序没有init.py文件。 - Serg Smyk
4
我的应用程序运行正常,但单元测试失败。运行测试时,使用 __init__.py 文件一共跑了101个测试,最后一个测试由于导入错误而失败。删除 __init__.py 文件后,一共跑了100个测试,全部通过了。 - run_the_race
我原以为这是问题所在,但实际上并不是。请参考@farid-chowdhury的下一个答案。我使用的是Python的shell,而不是Django的Python shell。需要调整一堆路径,但现在一切都正常了,很可能需要__init__的帮助。 - DonkeyKong

54

我在使用PyCharm运行测试时遇到了完全相同的错误。我通过明确设置DJANGO_SETTINGS_MODULE环境变量来解决了这个问题。如果您正在使用PyCharm,只需点击编辑配置按钮,然后选择环境变量

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

似乎出现此错误是因为PyCharm使用其自己的manage.py运行测试。


3
在运行Pycharm测试时遇到了这个问题,尽管通过Pycharm运行服务器不需要我添加设置。手动将DJANGO_SETTINGS_MODULE添加到测试配置中解决了我的问题。 - PhoebeB
2
此外,在编辑配置时,编辑模板非常有用。 - Yngve Høiseth
3
设置 -> 语言和框架 -> Django -> 在设置下添加一个值将自动为每个新的Django和Django测试运行配置设置“DJANGO_SETTINGS_MODULE”。 - Tobias Ernst
FYI,我按照这个解决方案的指示做了,但第一次并没有成功。原来,当我点击“应用”然后再点击“确定”时,PyCharm没有保存DJANGO_SETTINGS_MODULE。我第二次尝试后就可以了。看起来像是PyCharm的一些奇怪问题。 - MikeyE
我必须确保正确声明导入:从<app>.<module> import <class> - PyCharm自动导入缺少<app>。一旦我纠正了这个问题(还检查了依赖模块),它就可以正常工作了。 - Matthew Hegarty

39

当我使用./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 x 更改为 from .fields import x - daigorocub
为什么Python/ Pylint没有警告你这个问题?这只是一个微小的细节,错误描述了完全不同的东西,而且很容易被代码检查工具修复。 - aside
这是对我有效的方法,尽管Pylance建议使用这种格式。谢谢。 - Youssef Snoussi

27
作为一个使用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,问题解决。


15
欢迎来到stackoverflow!我想提醒一下,您的回答与问题没有关联。作为新手,您应该在验证正确性之前小心地提出解决方案。但是请继续光顾,并在可以时发布具体的答案 - 谢谢! - evadeflow
4
我希望更多的 Stack 评论像你的一样 Xeon Phil。太多新用户被疯狂的评论者赶走了,他们不开心因为自己在第一天不是 Stack 专家。 - Slbox
1
你说得对,@evadeflow,我的第一个答案看起来确实毫无关联,我会尝试澄清答案。不管怎样,希望这个答案能有所帮助。 - rpstw
在我的案例中也遇到了类似的问题。需要将'from ..core.models import CommonInfo' 更改为 'from apps.core.models import CommonInfo'。 - user42488
你的答案是有效的。在Django开始项目时,请勿删除manage旁边的__init__(如果存在)。这是完全相关的。 - user2290820
显示剩余2条评论

22

我刚刚也遇到了同样的问题。通过在应用程序名称上添加命名空间,我已经解决了自己的问题。希望能对某些人有所帮助。

apps.py

from django.apps import AppConfig    

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

1
将下面的程序相关内容从英语翻译成中文。仅返回已翻译的文本:加上可能的: label ='sales_client' - mirek
是的,这解决了我的问题。我使用了Django Cookiecutter项目,并创建了一个子应用程序,因为那是我的用户应用程序所在的级别。所以该应用程序位于project_dir.app.sub_app中,而我的名称是sub_app,但实际上需要是app.sub_app。这是因为生成应用程序时我使用了python ../manage.py startapp app命令。 - Moemars
在数百个建议的修复方案中,这是最终让我恢复运行的一个。 - lime

21
我遇到了类似的问题,但是我通过在我的模型类中使用Meta类来明确指定app_label,成功解决了我的问题。
class Meta:
    app_label  = 'name_of_my_app'

1
谢谢Benjamin!在我的Django项目中,我正在使用Sphinx生成文档,而::autoclass指令一直出现“app_label”错误,直到我按照您的建议将其添加到模型的Meta类中。 - Stefan Musarra
这帮助我将自定义应用程序添加为我的应用程序的依赖项。这意味着依赖项不需要在设置中编写“installed_apps”。非常有帮助。https://docs.djangoproject.com/en/4.1/ref/models/options/#app-label - miller the gorilla

15

在测试中导入模型时,我遇到了这个错误,即给定以下Django项目结构:

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

我在文件test_models.py中以以下方式导入了MyModel

from models import MyModel

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

from myapp.models import MyModel

希望这能对你有所帮助!

顺便说一句:也许有点晚了,但我在其他答案中没有找到如何解决我的代码问题,我想分享我的解决方案。


juliocesar,你是个冠军。谢谢。这是一个荒谬的错误。 - Kirk
4
找到这个东西花费的时间比预期的要长。我在我的test.py文件中使用了相对导入。在使用from .models import MyModel时出现了错误。将其更改为from myapp.models import MyModel解决了这个问题。 - monkut
1
@monkut 我也是。我想知道这是为什么。顺便说一下,我使用自定义应用程序文件夹。在项目根目录中的“/apps”,添加到路径中。 - user5721897
我必须承认,我一开始以为不可能是我做的,原来是从IntelliJ自动导入的。谢谢你的回答。 - ekydfejj

11

在不断遇到这个问题并回到这个问题后,我想分享一下我的问题所在。

@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和migrate命令!祝好运。


这是适合我的解决方案,此问题在使用Django Cookie Cutter生成引导Django项目后出现,我稍后使用startapp管理命令添加了一个应用程序。 - Brian Obot

8
今天我在运行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

当运行./manage.py test时,出现了Django模型没有声明显式的app_label错误。

要解决这个问题,我必须在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


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

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