RuntimeError: Model class xxx doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

RuntimeError: Model class xxx doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS

我参考了以下基于 Django 2.0 和 cookiecutter-django 的 GitHub 存储库:github.com/Apfelschuss/apfelschuss/tree/c8851430201daeb7d1d81c5a6b3c8a639ea27b02

我在尝试 运行 应用程序时遇到以下错误:

RuntimeError: Model class votes.models.Author doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.

错误出现 this line of code

我尝试按照 中的描述进行操作,但没有成功:

config/settings/base.py

LOCAL_APPS = [
    "apfelschuss.votes.apps.VotesConfig"
]

apfelschuss/votes/apps.py

from django.apps import AppConfig


class VotesConfig(AppConfig):

    name = "apfelschuss.votes"
    verbose_name = "Votes"

知道我做错了什么吗?

如果有人对如何 运行 存储库的 docker 容器感兴趣。它被描述为 here.

当它显示 "Model class xxx doesn't declare an explicit app_label" 时,您的模型可以指定 Meta 来定义它们的 app_label。您还可以自定义数据库 table 名称以及一系列其他选项作为元数据的一部分。

您需要对所有模型执行类似的操作;

class Author(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    profile_picture = models.ImageField()

    class Meta:
        app_label = 'apfelschuss.votes'

    def __str__(self):
        return self.user.username

编辑

我查看了您的存储库,我认为您将 usersvotes 应用程序置于 apfelschuss.

下,使项目过于复杂

我将它们拉到项目的根目录并且一切运行顺利; https://github.com/marksweb/apfelschuss/tree/so/questions/55553252

这是 django/python 项目中更典型的项目结构方法。

在视图中使用绝对导入解决了我的问题。我将 .models 更改为 apfelschuss.votes.models.

导致运行时错误的代码:

from django.shortcuts import render

from .models import Voting

问题已通过绝对导入解决:

from django.shortcuts import render

from apfelschuss.votes.models import Voting

参见 GitHub here 上的提交。

您不小心在 settings.pyMIDDLEWARE 部分下添加了您的应用程序名称。

花了一些时间进行调试,认为这可能有助于节省其他人的时间。

我在 VS Code 上使用 Python 3.7.5。同样的问题让我感到困惑。 我进入最初创建的项目,发现 settings.py

去了部分

INSTALLED_APPS = []

并添加了

'myapp.apps.MyappConfig', - 确保大小写正确

这指的是应用程序 apps.py 中的 class 导致问题

我遇到了同样的错误,并通过向我的项目根目录中的主模块添加一个丢失的 __init__.py 文件(只是一个空白文件)来修复它。

~/my_project
    foo/
        models.py
        tests.py
        __init__.py  # <-- Added an empty __init__.py here

在文件 apps.py 中我们看到:

class ArticlesConfig(AppConfig):
    default_auto_field = 'django.db.models.BigAutoField'
    name = 'Django.apps.articles'

我们需要名字'Django.apps.articles'

现在在终端中写入:

from Django.apps.articles.models import Article

一切正常!我 运行 在 PyCharm 中解决了这个问题。