【问题标题】:Django 1.9 deprecation warnings app_labelDjango 1.9 弃用警告 app_label
【发布时间】:2015-04-14 19:24:01
【问题描述】:

我刚刚更新到 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):

现在这给我提出了 3 个问题。

  1. 根据documentationOptions.app_label 不是必需的,除非模型在应用程序模块之外,在我的情况下,它不是。其次,无论如何,这种行为在 1.7 中已被弃用,为什么它甚至是一个问题?
  2. 应用程序都在 INSTALLED_APPS 元组中,所以肯定不是这样吗?
  3. 如果所有内容都在 INSTALLED_APPS 元组中,为什么在调用应用程序之前不加载应用程序?

如果我确实做错了什么,那么正确的做法是什么,因为文档并没有真正弄清楚导致这个问题的原因或如何纠正它。

【问题讨论】:

    标签: python django deprecation-warning


    【解决方案1】:

    如警告中所述,这会发生:

    • 当您使用不在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 中引入的。

    【讨论】:

    • 有趣,但是我不认为这正是问题所在。我只在我的一个应用上使用信号;这会导致我的三个应用出错吗?
    • 好吧,由你来尝试。我遇到了这个问题,这就是我解决它的方法。请参阅错误信息和实际代码提交以获取更多信息。
    • 谢谢。对我来说,我的主要 urls.py 是导入自定义模型。
    【解决方案2】:

    类似的错误。就我而言,错误是:

    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

    【讨论】:

    • 也许我的答案不清楚,因为我的原始错误几乎与 OP 相同,因此我更新了我的答案以使其更清晰。就我而言,我添加了'django.contrib.sites'。不知道为什么您认为这个答案可能对其他人没有帮助。
    • @Anand S Kumar ...只是出于好奇,您为什么删除了关于我的帖子与此问题无关的评论?
    • 我使用的是 1.8。这样做会导致 django.contrib.sites.models.DoesNotExist:站点匹配查询不存在。所以我又回到了警告中。
    • 我在 django-braces 和 django.contrib.auth 模块的 Permission 模型中遇到了类似的问题。我将 django.contrib.auth 添加到 INSTALLED_APPS 元组中,它起作用了。谢谢。
    【解决方案3】:

    我怀疑只有极少数人会看到这个错误,因为它会由与我相同的事情引起,但如果它对其他人有帮助,似乎值得添加这个答案!

    我在一次运行测试时突然看到很多这样的错误 - 结果我不小心在我的 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):
    

    ...在完全限定的模型名称中包含项目所在目录的名称 (mystupiddjangoproject),它应该是:alerts.models.Alert

    要解决这个问题,我只需要这样做:

    rm __init__.py
    rm __init__.pyc
    

    【讨论】:

    • 我担心没有人能解决我的问题,但这解决了它!
    • 这也帮助了我......它也影响了我模型的一个奇怪的子集,这使得它变得更加不清楚。谢谢!
    • 我认为根本原因描述在code.djangoproject.com/ticket/26570
    • 我只在运行单元测试时出现此错误,而不是在正常运行应用程序时出现此错误,这已解决!非常感谢!
    【解决方案4】:

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

    C:\Program Files\Python 2.7\lib\site-packages\django\contrib\sessions\models.py:27: RemovedInDjango19Warning: Model class django.contrib.sessions.models.Session 没有声明明确的 app_label并且要么不在 INSTALLED_APPS 中的应用程序中,要么在加载其应用程序之前导入。 Django 1.9 将不再支持此功能。 类会话(models.Model):

    这是由settings.py 中的INSTALLED_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',
    )
    

    现在我知道这可能不会直接回答您的问题,但它回答了一个相关问题,并且由于这是粘贴错误时在 Google 上显示的唯一 SO 链接,因此我已在此处回答。

    但是,我相信类似的情况会导致您的问题:

    确保在应用程序使用它们之前声明“依赖”应用程序!错误并没有真正指定哪个应用程序正在使用模型,因此您必须推送包含模型的应用程序它会一一提到顶部,直到错误消失。

    【讨论】:

      【解决方案5】:

      使用 app_label 属性向您的模型添加元类。

      class Meta:
          app_label = 'app_model_belongs_to'
      

      希望这行得通!

      编辑: 造成这种情况的原因通常是模型存在于标准位置之外。

      更多信息请参考: https://docs.djangoproject.com/en/1.8/ref/models/options/#app-label

      【讨论】:

      • 如果您阅读文档,您会发现 1.7 app_label 不再需要。所以这真的不能回答这个问题。
      • 我在文档中看到这在 1.7 中是不需要的。然而,这是 Django 1.9 的一种 PendingDeporcation 错误。这解决了我摆脱错误的问题。我一直在进行测试和研究,试图弄清楚到底发生了什么,但就像我说的那样,解决方案就是解决方案。
      • 临时修复不是解决方案,它只是掩盖了稍后需要处理的问题。
      • 很公平。我会继续努力寻找更好的答案。感谢您的反馈
      • 这很有帮助,谢谢,因为EDIT: The reason for this is usually that the model exists outside of the standard locations. 完全正确。在我的工作中,我正在使用 django 模型(继承自我的项目模型),这些模型是我在一个 jupyter notebook 中创建的,该笔记本用完我的项目的 docker 容器。
      【解决方案6】:

      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'
      

      【讨论】:

        【解决方案7】:

        我也遇到过这个问题,这与我从应用加载信号.py 模块的方式有关

        正如您现在所见,信号和模型之间存在循环导入问题很常见,通常从应用程序的 __init__.py 文件或 models.py 文件的底部导入它们以避免它们。

        嗯,我使用的是__init__.py 方法,只是import signals 语句移动到我的models.py 文件的底部解决了这个问题

        希望这对其他人有帮助!

        【讨论】:

          【解决方案8】:

          我在将 Django 从 1.8 升级到 1.9.1 后遇到了这个问题:

          RuntimeError at /

          模型类 blog.models.BlogCategory 没有明确声明 app_label 并且不在 INSTALLED_APPS 中的应用程序中。

          这有助于解决:

          在博客/models.py 中:

          class BlogCategory(models.Model):
              some vars & methods
          
              class Meta:
                  app_label = 'BlogCategory'
          

          这是 100% 的工作。

          【讨论】:

          • 这并不能解决问题。正如文档中明确指出的那样,不需要应用标签。我正在寻找解决此问题的方法,而不是创可贴
          • 不要用您的 cmets 误导他人。该解决方案有效,经过多次测试。需要使用“Meta”类,会是在数据库的传输过程中没有错误,因为它指示了Django如何调用数据库中的表。
          • 该评论没有误导性。答案并没有完全回答原始问题。在撰写本文时,文档指出此解决方案不是必需的,因此给出的错误与文档相矛盾。
          • 感谢这个简单的解决方案。 (为什么我还是想要一个“signals.py”?!?:)
          • 谢谢。这对我来说非常有效。我正在关注优秀的 Effectivedjango.com/tutorial/,它(显然)不符合我的 django == 1.9.5 版本。非常简单。保持良好的工作。不要让批评家打压你。
          【解决方案9】:

          我遇到了同样的问题。我在 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),它试图导入我的一个自定义模型。

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

          【讨论】:

            【解决方案10】:

            有时与当前源代码不匹配的无效 .pyc 文件会导致此问题。

            我删除了所有 .pyc 以使用此 bash 刷新所有文件

            find . -name "*.pyc" -exec rm -rf {} \;

            【讨论】:

              【解决方案11】:

              解决此问题的最简单最简单的方法是将“导入信号”命令放在您正在使用的模型文件的底部。这可确保在导入该模型的信号之前加载所有模型。您必须为要导入的每个模型执行此操作(如果您使用链接到特定模型的接收器),或者在设置中“已安装应用程序”末尾的应用程序的 models.py 中执行此操作。

              只有在处理非模型类型信号时才需要其他解决方案,其中模型永远不会首先导入。

              为什么在文档中没有注明这是一个谜,因为我刚刚被它抓住,直到我记得你必须这样做。

              models.py

              from django.db import models
              
              class MyModel(models.Model):
                  myfield1 = models.CharField()
                  myfield2 = models.CharField()
              
              import signals
              

              然后在signals.py中:

              from django.db.models.signals import pre_save # Or whatever you are using
              from django.dispatch import receiver
              
              from .models import MyModel
              
              @receiver(pre_save, sender=MyModel)
              def my_receiver(sender, instance, **kwargs):
                  mysender = sender
                  print mysender
              

              这样。

              【讨论】:

                【解决方案12】:

                我在 django 1.7 中没有收到任何错误。 在迁移到 django 1.8 时出现此错误。 原因是信号在app/signal_receiver.py 中定义。

                我创建了一个apps.py

                from django.apps import AppConfig
                
                class TasksConfig(AppConfig):
                    name = 'core'
                    verbose_name = "core"
                
                    def ready(self):
                        import core.signal.handler
                

                我将信号接收器移到信号包内的handler.py 中。

                【讨论】:

                  【解决方案13】:

                  我收到此错误是因为有错误:

                  urlpatterns = patterns(
                  url(r'^my_link/$', views.MyView.as_view(), name='my_view'),...
                  

                  做正确的事:

                  urlpatterns = patterns(
                  '', # Add this line
                  url(r'^my_link/$', views.MyView.as_view(), name='my_view'),
                  ...)
                  

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-04-29
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多