运行时错误:模型类xxx没有声明明确的app_label,并且不在INSTALLED_APPS中的一个应用程序中。

13
我参考了以下基于Django 2.0和cookiecutter-django的GitHub库:github.com/Apfelschuss/apfelschuss/tree/c8851430201daeb7d1d81c5a6b3c8a639ea27b02 当尝试运行应用程序时,出现了以下错误:

RuntimeError:模型类votes.models.Author没有声明明确的app_label,并且不属于INSTALLED_APPS中的应用程序。

此错误是由此代码行引起的。
我尝试按照https://dev59.com/sVkS5IYBdhLWcg3wNkH6#40206661中所述的做法,但没有成功: 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容器,可以在这里找到相关说明:https://cookiecutter-django.readthedocs.io/en/latest/developing-locally-docker.html

6个回答

20
当出现“模型类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

编辑

我查看了你的repo,认为你在apfelschuss下拥有usersvotes应用程序过于复杂。

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

这是Django/Python项目中更典型的项目结构方法。


感谢您的反馈,马克。实际上,这个模型在INSTALLED_APPS之外没有被定义,对吧?很抱歉,我是Python新手。尽管如此,我按照描述添加了meta,但不幸的是,我得到了_ValueError: Invalid model reference 'apfelschuss.votes.Voting_categories'。字符串模型引用必须采用'app_label.ModelName'的形式。我尝试了一些其他字符串,但没有成功。 - Philipp
是的,从技术上讲它不是必需的,但这就是你的错误提示。我认为模型上的app_label不支持那种点路径的方法——我只是想说明这个概念。此外,我在django 2.2中运行你的应用程序没有问题。我会尝试运行你的完整项目和docker,但apfelschuss.votes.apps.VotesConfig应用程序可以加载和安装。 - markwalker_
2
感谢您的反馈,马克。由于我使用cookiecutter-django作为骨架,因此我更喜欢将应用程序放在第二级“apfelschuss”文件夹中(请参见#1876)。 - Philipp
2
这应该是被接受的答案!在我的情况下,我将模型移动到另一个位置,并且必须像您指定的那样添加Meta才能使其正常工作。谢谢提供链接。像其他答案中建议的更改相对于绝对导入并没有帮助-我已经在使用绝对路径并遇到了这个问题。 - yǝsʞǝla

17

在视图中使用绝对导入解决了我的问题。 我将.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上查看提交,请点击这里


3
正确的答案是添加 Meta。如果您的模型不在与应用程序相同的目录/包中,则绝对导入不起作用。 - yǝsʞǝla
1
绝对导入对我的模型没有其他更改就奏效了。我更喜欢相对导入。有什么方法可以实现吗? - Zach

2

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

进入了下面的部分:

INSTALLED_APPS = []

并添加

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

这指的是引起问题的应用程序中的apps.py中的类


1
在文件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中遇到了这个问题。


1
你不小心将应用程序名称添加到了settings.py中的MIDDLEWARE部分。
花费了一些时间进行调试,想到这可能会帮助节省其他人的时间。

1
感谢Mujeeb提供的反馈和故障排除。老实说,我不太确定您指的是哪里?由于我使用的是Cookiecutter设置,所以没有settings.py。请参见此处。在base.py中安装的应用程序为INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS,但我没有将我的应用程序添加到中间件中。 - Philipp
1
谢谢你,Philpp。所以,我遇到了和你一样的错误,而且错误就像上面提到的那样。答案当然不是为了你,而是为了未来可能会遇到同样问题的其他人。如果这对你没有帮助,请告诉我,我会删除它。谢谢。 - Mujeeb Ishaque
1
啊,现在我明白了 :-) 我相信这会帮助其他人。谢谢澄清,Mujeeb。 - Philipp

0

我遇到了同样的错误,通过在项目根目录下的主模块中添加一个缺失的__init__.py文件(只需一个空文件)来解决它。

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

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