我真是一筹莫及。经过十几个小时的故障排除,可能更多,我以为我终于可以做生意了,但接着我发现:
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'
在我的例子中,我在将代码从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 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问题都得到了解决。