【问题标题】:RuntimeError: Model class xxx doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPSRuntimeError:模型类 xxx 未声明显式 app_label 且不在 INSTALLED_APPS 中的应用程序中
【发布时间】:2019-08-28 09:53:13
【问题描述】:

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

尝试运行应用程序时出现以下错误:

RuntimeError:模型类 votes.models.Author 没有声明 显式 app_label 并且不在 INSTALLED_APPS 中的应用程序中。

this line of code 出现错误。

我尝试按照https://stackoverflow.com/a/40206661/5894988 中的描述进行操作,但没有成功:

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"

知道我做错了什么吗?

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

【问题讨论】:

    标签: django python-3.x cookiecutter-django


    【解决方案1】:

    当它显示“模型类 xxx 未声明显式 app_label”时,您的模型可以指定 Meta 来定义它们的 app_label。您还可以自定义数据库表名以及一系列其他选项作为元数据的一部分。

    你需要在你所有的模型上做这样的事情;

    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
    

    编辑

    我已经查看了您的存储库,我认为您在 apfelschuss 下使用 usersvotes 应用程序使项目过于复杂。

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

    这是django/python项目中比较典型的项目结构方式。

    【讨论】:

    • 感谢您对马克的赞赏反馈。实际上,这个模型不是在 INSTALLED_APPS 之外定义的,对吧?对不起,我是 python 新手。尽管如此,我还是按照描述添加了元数据,但不幸的是我得到了 ValueError: Invalid model reference 'apfelschuss.votes.Voting_categories'。字符串模型引用必须采用“app_label.ModelName”形式。我还尝试了其他一些字符串,但均未成功。
    • 是的,从技术上讲它是不需要的,但这就是你的错误告诉你的。我认为模型上的app_label 不支持这种虚线路径方法——我试图说明这个概念比什么都重要。另外,我在 django 2.2 中运行您的应用程序没有问题。我将尝试您的完整项目和 docker,但会加载和安装 apfelschuss.votes.apps.VotesConfig 应用程序。
    • 感谢您对马克的赞赏反馈。由于我使用 cookiecutter-django 作为骨架,我更喜欢将应用程序放在第二级 apfelschuss 文件夹中(请参阅 #1876)。
    • 这应该是公认的答案!就我而言,我将模型移到另一个地方,并且必须像您指定的那样添加 Meta 才能使其正常工作。也感谢您的链接。像其他答案中建议的那样更改相对于绝对导入并没有帮助 - 我已经在使用绝对路径并且遇到了这个问题。
    【解决方案2】:

    在视图中使用绝对导入解决了我的问题。我将 .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

    【讨论】:

    • 正确答案是添加Meta。如果您建模并且与应用程序不在同一目录/包中,则绝对导入不会做任何事情。
    • 绝对导入对我有用,对模型没有其他更改。我会更喜欢相对进口。有没有办法做到这一点?
    【解决方案3】:

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

    去了部分

    INSTALLED_APPS = []
    

    并添加了

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

      • 感谢您的反馈和 Mujeeb 故障排除。老实说,我不确定您指的是哪里?因为我使用 Cookiecutter 设置,所以我没有 settings.py。见here。 base.py 中安装的应用程序是INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS,但我没有将我的应用程序添加到中间件。
      • 谢谢你,菲尔普。所以,我得到了和你一样的错误,错误如上所述。答案当然不是给你,而是给其他人,也许将来会面临同样的问题。如果它没有任何帮助,请告诉我,我将删除它。谢谢。
      • 啊,现在我明白了 :-) 我相信它会帮助其他人。感谢 Mujeeb 的澄清。
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2021-10-23
        • 2018-12-29
        • 2016-05-25
        • 2020-05-16
        • 2017-09-05
        • 2023-02-18
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多