我真是一筹莫及。经过十几个小时的故障排除,可能更多,我以为我终于可以做生意了,但接着我发现:
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',
]
我的app .py文件是这样的:
from django.apps import AppConfig
class DeletenoteConfig(AppConfig):
name = 'DeleteNote'
and
from django.apps import AppConfig
class LibrarysyncConfig(AppConfig):
name = 'LibrarySync'
您是否遗漏了将应用程序名称放入设置文件中?
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文件中添加以下代码来更改它的外观
我的应用名称/应用程序.py
class myAppNameConfig(AppConfig):
name = 'myAppName'
verbose_name = 'A Much Better Name'
作为一个使用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,问题就解决了
很可能您有依赖的导入。
在我的例子中,我在我的模型中使用了一个序列化器类作为参数,并且序列化器类使用了这个模型:
serializer_class = AccountSerializer
from ..api.serializers import AccountSerializer
class Account(AbstractBaseUser):
serializer_class = AccountSerializer
...
在“serializers”文件中:
from ..models import Account
class AccountSerializer(serializers.ModelSerializer):
class Meta:
model = Account
fields = (
'id', 'email', 'date_created', 'date_modified',
'firstname', 'lastname', 'password', 'confirm_password')
...
我在测试中导入模型时遇到了这个错误,即给出这个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
希望这能有所帮助!
PS:也许这有点晚了,但我在其他人的答案中没有发现如何解决我的代码中的这个问题,我想分享我的解决方案。
我只是遇到了这个问题,并找出了哪里出了问题。由于之前的回答没有描述这个问题发生在我身上,我想我可以把它发布给其他人:
the issue came from using python migrate.py startapp myApp from my project root folder, then move myApp to a child folder with mv myApp myFolderWithApps/.
I wrote myApp.models and ran python migrate.py makemigrations. All went well.
then I did the same with another app that was importing models from myApp. Kaboom! I ran into this error, while performing makemigrations. That was because I had to use myFolderWithApps.myApp to reference my app, but I had forgotten to update MyApp/apps.py. So I corrected myApp/apps.py, settings/INSTALLED_APPS and my import path in my second app.
but then the error kept happening: the reason was that I had migrations trying to import the models from myApp with the wrong path. I tried to correct the migration file, but I went at the point where it was easier to reset the DB and delete the migrations to start from scratch.
长话短说:
-这个问题最初是来自myApp的apps.py中的应用程序名称错误,在设置和我的第二个应用程序的导入路径。
-但仅仅纠正这三个地方的路径是不够的,因为导入时引用了错误的应用程序名称。因此,同样的错误在迁移过程中不断发生(除了这次是从迁移中)。
所以…检查您的迁移,祝您好运!
在我的例子中,我在将代码从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服务器吐出的错误消息的最后一部分。然而,如果你向上滚动,你会在错误的中间找到原因。
我今天试图运行Django测试时出现了这个错误,因为我在其中一个文件中使用了.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模型在运行./manage.py测试时没有显式声明app_label。
为了解决这个问题,我必须显式地从models/__init__.py中的完整路径导入:
from myapp.models.foo import *
from myapp.models.bar import *
这就解决了错误。
H - t https://medium.com/@michal。博克fix-weird-exceptions-when-running-django-tests-f58def71b59a
在我的例子中,发生这种情况是因为我在项目级urls.py、INSTALLED_APPS和apps.py中使用了相对模块路径,而不是在项目根目录中。即绝对模块路径贯穿始终,而不是相对模块路径+ hacks。
无论我在我的应用程序中的INSTALLED_APPS和apps.py中的路径有多混乱,我都无法让runserver和pytest同时工作,直到它们都根植于项目根目录中。
文件夹结构:
|-- manage.py
|-- config
|-- settings.py
|-- urls.py
|-- biz_portal
|-- apps
|-- portal
|-- models.py
|-- urls.py
|-- views.py
|-- apps.py
下面,我可以运行manage.py runserver和gunicorn与wsgi和使用门户应用程序视图没有麻烦,但pytest会错误与ModuleNotFoundError:没有模块命名为'apps'尽管DJANGO_SETTINGS_MODULE配置正确。
配置/ settings.py:
INSTALLED_APPS = [
...
"apps.portal.apps.PortalConfig",
]
biz_portal / apps / portal / apps . py:
class PortalConfig(AppConfig):
name = 'apps.portal'
配置/ urls . py:
urlpatterns = [
path('', include('apps.portal.urls')),
...
]
将config/settings.py中的app引用更改为biz_portal.apps.portal.apps。PortalConfig和PortalConfig.name到biz_portal.apps。门户允许pytest运行(我还没有对门户视图进行测试),但runserver会出错
模型类apps.portal.models.Business没有显式声明app_label,也不在INSTALLED_APPS中的应用程序中
最后,我为应用程序做了准备。门户查看哪些仍然使用相对路径,并发现config/urls.py也应该使用biz_portal.apps.portal.urls。
在不断遇到这个问题并不断回到这个问题之后,我想我应该分享我的问题是什么。
@Xeberdee的所有内容都是正确的,所以遵循它,看看是否解决了问题,如果没有,这是我的问题:
在我的app .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命令之后!祝你好运
在我的例子中,在settings.py中的BASE_DIR有一个问题。这是包的结构:
project_root_directory
└── service_package
└── db_package
├── my_django_package
│ └── my_django_package
│ ├── settings.py
│ └── ...
└── my_django_app
├── migrations
├── models.py
└── ...
它在更新settings.py时工作:
INSTALLED_APPS = [
'some_django_stuff_here...',
'some_django_stuff_here....',
...
'service_package.db_package.my_django_app'
]
BASE_DIR指向项目根目录
BASE_DIR = Path(__file__).resolve().parent.parent.parent.parent.parent
在调试中运行django,在registry.py中使用断点-> def get_containing_app_config(self, object_name)
这里没有一个答案解决了我的问题,把我们都带到这里的错误消息对我来说是一个转移注意力的错误消息——但我确实找到了一个解决方案。
对我来说,这个问题的真正原因是:
Django tries to register apps
Some exception occurs during app registration (root cause)
Something in exception handling tooling pulls in a model somewhere
That model lives in an app that hasn't been registered (because, remember, app registration was broken by the root cause exception above)
Finally, as its last act before dying Django spits out the (red herring) complaint that brought us all here - i.e. 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>
同样,“根本原因”问题对你来说可能不同——但对我来说是不同的:我正在从1.11升级一个遗留的Django应用程序。X ~ 3.2.x。在此过程中,Django做了一个破坏向后兼容性的改变,要求模型上所有的ForeignKey和OneToOne属性都有一个on_delete参数。
我为应用程序中的200多个违规情况添加了这个参数,我的根本原因问题和没有声明显式app_label问题都得到了解决。