Django 1.9 废弃警告 app_label

59

我刚刚升级到Django v1.8,在更新项目之前测试本地设置时,出现了一个我从未见过的弃用警告,也不太能理解。可能是我忽略了什么或者误解了文档。

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:6: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Difficulty doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Difficulty(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:21: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Zone doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Zone(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:49: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Boss doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Boss(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/raiding/models.py:79: RemovedInDjango19Warning: Model class ankylosguild.apps.raiding.models.Item doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Item(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:14: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Category doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Category(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:36: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Comment doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Comment(ScoreMixin, ProfileMixin, models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:64: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Forum doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Forum(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:88: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.Post doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Post(ScoreMixin, ProfileMixin, models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:119: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.CommentPoint doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class CommentPoint(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/forum/models.py:127: RemovedInDjango19Warning: Model class ankylosguild.apps.forum.models.TopicPoint doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class TopicPoint(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/auctionhouse/models.py:10: RemovedInDjango19Warning: Model class ankylosguild.apps.auctionhouse.models.Auction doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Auction(models.Model):

/Users/neilhickman/Sites/guild/ankylosguild/apps/auctionhouse/models.py:83: RemovedInDjango19Warning: Model class ankylosguild.apps.auctionhouse.models.Bid doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Bid(models.Model):

现在这给我提出了三个问题。
  1. 根据文档,除非模型位于应用程序模块之外,否则Options.app_label不是必需的,而在我的情况下,它并不是。其次,这种行为在1.7中已被弃用,那么为什么它还是一个问题?
  2. 所有应用程序都在INSTALLED_APPS元组中,所以肯定不可能是那个原因吧?
  3. 如果所有内容都在INSTALLED_APPS元组中,为什么应用程序在调用之前没有被加载呢?
如果我确实做错了什么,正确的做法是什么,因为文档并没有清楚地说明是什么导致了这个问题或如何纠正它。
13个回答

51

类似的错误。在我的情况下,错误是:

RemovedInDjango19Warning: Model class django.contrib.sites.models.Site doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
class Site(models.Model):

我的解决方案是:
'django.contrib.sites'添加到INSTALLED_APPS中。

1
也许我的回答没有表达清楚,因为我的原始错误与 OP 几乎相同,所以我更新了我的回答以使其更清晰。在我的情况下,我添加了 'django.contrib.sites'。不确定为什么在您的看法中,这个答案可能对其他人没有帮助。 - WayBehind
@Anand S Kumar...只是出于好奇,您为什么删除了关于我的帖子与这个问题无关的评论? - WayBehind
1
我正在使用1.8版本。这样做导致了django.contrib.sites.models.DoesNotExist错误:找不到匹配查询的站点。所以我只能忍受这个警告。 - sureshvv
1
我在使用django-braces和django.contrib.auth模块的Permission模型时遇到了类似的问题。我将django.contrib.auth添加到了INSTALLED_APPS元组中,问题得以解决。谢谢。 - Matthew Purdon

50

如警告所述,这种情况会出现在以下两种情况之一:

  • 当您使用的模型不在INSTALLED_APPS中时;
  • 或者当您在应用程序加载之前使用模型时。

由于您在INSTALLED_APPS设置中提到了该应用程序,因此最有可能是在应用程序初始化之前使用了模型。

通常,这会在apps.py早期信号(例如post_migrate)中使用from .models import SomeModels时发生。 与其在此处以传统方式引用您的模型,建议使用AppConfig.get_model()。 检查您的apps.py文件是否导入任何模型,并使用此API替换它们。

例如,使用以下方式代替:

# apps.py

from django.apps import AppConfig
from .models import MyModel

def do_stuff(sender, **kwargs):
    MyModel.objects.get() # etc...

class MyAppConfig(AppConfig):
    name = 'src.my_app_label'

    def ready(self):
        post_migrate.connect(do_stuff, sender=self)

做这个:

# apps.py

from django.apps import AppConfig

def do_stuff(sender, **kwargs):
    mymodel = sender.get_model('MyModel')
    mymodel.objects.get() # etc...

class MyAppConfig(AppConfig):
    name = 'src.my_app_label'

    def ready(self):
        post_migrate.connect(do_stuff, sender=self)

请注意,这项执法是在错误#21719中引入的。


Note this enforcement was introduced in bug #21719.

有趣的是,我不认为这正是问题所在。 我只在其中一个应用程序中使用信号; 这会导致我的三个应用程序出现错误吗? - Llanilek
好的,尝试一下吧。我曾经遇到过这个问题,这是我解决它的方法。请参考错误信息和实际代码提交以获取更多信息。 - Antwan
谢谢。对我来说,我的主要urls.py正在导入一个自定义模型。 - Derrick Petzold

23
我猜只有极少数人会遇到和我一样的问题,导致出现这个错误。但是如果能帮助其他人,那么添加这个答案似乎是值得的!
有一次在运行测试时,突然看到了很多这样的错误 - 原来我不小心在 Django 项目的顶层目录下创建了一个 __init__.py 文件,而它应该在子目录中。判断这种情况的线索是这些错误信息,例如:
/home/mark/mystupiddjangoproject/alerts/models.py:15: RemovedInDjango19Warning: Model class mystupiddjangoproject.alerts.models.Alert doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9.
  class Alert(models.Model):

这段内容涉及到IT技术,其中提到了项目所在的目录名称(mystupiddjangoproject),而完全限定模型名称应该是:alerts.models.Alert

为了解决这个问题,我只需要执行以下操作:

rm __init__.py
rm __init__.pyc

6
我曾担心没有人能解决我的问题,但这个方法解决了它! - allthethings
2
这也帮助了我...它也影响了我一些奇怪的模型,使得情况更加不清楚。谢谢! - ZachM
我认为根本原因在于 https://code.djangoproject.com/ticket/26570 中有所描述。 - Torsten Bronger
1
我只有在运行单元测试时才遇到了这个错误,而在正常运行应用程序时没有出现此问题。这样修复了它!非常感谢! - EM0

10
我遇到了类似的错误,但是它抱怨的是contrib包中的模型,而不是我的应用程序中的模型。例如:

C:\Program Files\Python 2.7\lib\site-packages\django\contrib\sessions\models.py:27: RemovedInDjango19Warning: Model class django.contrib.sessions.models.Session doesn't declare an explicit app_label and either isn't in an application in INSTALLED_APPS or else was imported before its application was loaded. This will no longer be supported in Django 1.9. class Session(models.Model):

这是由于在settings.pyINSTALLED_APPS属性中顺序不正确导致的。我的settings.py最初包含以下内容:
INSTALLED_APPS = (
    'my_app_1',
    'my_app_2',
    'my_app_3',
    'bootstrap_admin',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.messages',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'social.apps.django_app.default',
    'mathfilters',
    'rest_framework',
)
my_app_*使用contrib包中的模型。错误是由于在声明模型之前使用它们(即在使用它们之前,Django应该知道包含这些模型的应用程序)引起的。
为了解决这个问题,需要改变声明应用程序的顺序。具体来说,所有Django应用程序都应该在用户定义的应用程序之前。在我的情况下,正确的INSTALLED_APPS如下:
INSTALLED_APPS = (
    'bootstrap_admin',
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.messages',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.staticfiles',
    'social.apps.django_app.default',
    'mathfilters',
    'rest_framework',
    'my_app_1',
    'my_app_2',
    'my_app_3',
)

现在我知道这可能不是直接回答您的问题,但它回答了一个相关的问题,而且既然这是唯一一个在谷歌上显示的SO链接,当粘贴错误时,我在这里回答了它。
然而,我认为类似的情况导致了您的问题:
确保您在使用它们的应用程序之前声明“依赖项”应用程序!错误并没有真正指定哪个应用程序正在使用模型,因此您需要逐个将包含所提到模型的应用程序推到顶部,直到错误消失。

8

1
如果你阅读文档,你会发现在1.7版本中app_label不再是必需的。所以这并没有回答问题。 - Llanilek
我在文档中看到,在1.7中不需要这个。但是对于Django 1.9来说,这是一种即将废弃的错误(PendingDeporcation error)。这解决了我的问题,让我摆脱了错误。我一直在进行测试和研究,试图弄清楚到底发生了什么,但像我说的,解决方案就是解决方案。 - Justin Ober
2
临时修复并非解决方案,只是为了暂时掩盖问题,待后续阶段再处理。 - Llanilek
2
好的,我会继续努力寻找更好的答案。感谢您的反馈。 - Justin Ober
这真的非常有帮助,谢谢,因为编辑:原因通常是模型存在于标准位置之外。完全正确。我在玩django模型(继承自我的项目模型),而这些模型是在运行在我的项目docker容器中的jupyter笔记本中创建的。 - Jerry Asher

5

在Django 1.9中处理这个问题并为您的应用程序提供一个漂亮的名称,需要执行以下操作:

在您的应用程序中添加一个名为apps.py的文件,并将以下内容添加到其中:

#apps.py
from django.apps import AppConfig


class YourAppNameAppConfig(AppConfig):
    name = 'yourappname'
    verbose_name = 'Your App Name Looking Right'

然后,在您应用的__init__.py文件中,添加以下内容:
#__init__.py    
default_app_config = 'youappname.apps.YourAppNameAppConfig'

5
我在将Django从1.8升级到1.9.1之后遇到了这个问题:
运行时错误:在INSTALLED_APPS中没有声明明确的app_label并且blog.models.BlogCategory不在应用程序中。
解决方法如下:
在blog/models.py中添加以下内容:
class BlogCategory(models.Model):
    some vars & methods

    class Meta:
        app_label = 'BlogCategory'

它可以100%地工作。


2
这并没有解决问题。因为文档明确说明应用标签不是必需的。我正在寻找解决这个问题的方法,而不是一时的权宜之计。 - Llanilek
不要用你的评论误导人们。这个解决方案是可行的,经过多次测试。 需要使用“Meta”类,这样在数据库传输过程中就不会出现错误,因为它告诉Django如何调用数据库中的表。 - Роман Арсеньев
该评论并不具有误导性。回答并没有完全回答原始问题。在撰写本文时,文档说明该解决方案并非必需,因此给出的错误与文档相矛盾。 - Llanilek
2
感谢这个简单的解决方案。(我为什么需要一个“signals.py”呢?!? :)) - GerardJP
谢谢。这对我非常有效。我正在遵循优秀的effectivedjango.com/tutorial/教程,但(显然)它与我的django版本== 1.9.5不兼容。非常简单。继续保持良好的工作状态。不要让批评家打击你。 - Love and peace - Joe Codeswell
@РоманАрсеньев:我不知道为什么这么多人大惊小怪。你的解决方案对我和其他人都有效,但这并不意味着它必须适用于每个人才能在这里发布。谢谢你,就像其他人所说的那样,不要让批评家 - 特别是当他们错了的时候 - 打击你的信心。 - Malik A. Rumi

5
我也遇到了这个问题,原因是我从应用程序中加载signals.py模块的方式不对
如你所知,信号和模型之间经常出现循环导入问题,通常会在应用程序的 __init__.py 文件或 models.py 文件底部引入它们以避免这些问题。
我一直在使用 __init__.py 引入,但只需将 import signals 语句移动到我的 models.py 文件底部即可解决此问题。
希望能帮助其他人!

4

我也遇到了同样的问题。我在django.db.models.base.py:line82处设置了一个断点,试图找出是什么原因导致了这个警告信息。

# Look for an application configuration to attach the model to.
app_config = apps.get_containing_app_config(module)

基本上,如果你的应用程序此时不存在,你会收到警告。我意识到我的问题是我有一个第三方框架(在我的情况下是 haystack),它试图导入我的一个自定义模型。

也许您在自定义应用程序之前列出了一个第三方包,并且您的第三方包引用了您的自定义应用程序?如果您还使用类似于Django rest框架的东西,这是可能的。


2
有时候,无效的 .pyc 文件与当前源代码不匹配会导致此问题。
我使用以下命令删除所有 .pyc 文件以刷新它们: find . -name "*.pyc" -exec rm -rf {} \;

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