我刚刚更新到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. 根据documentation的说法,Options.app_label不是必需的,除非模型在应用程序模块之外(在我的例子中,这不是必需的).其次,不管怎么说,这一行为在1.7中已被弃用,那么为什么它会成为问题呢?
  2. 应用程序都在install_apps元组中,所以肯定不会是这样吧?
  3. 如果所有内容都在INSTALLED_APPS元组中,为什么在调用应用程序之前不加载它们?

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

推荐答案

如警告中所述,会发生以下两种情况之一:

  • 当你使用的型号不是INSTALLED_APPS的时候;
  • 或者当您在加载模型的应用程序之前使用该模型时.

由于您确实引用了INSTALLED_APPS设置中的应用程序,这很可能是您在应用程序初始化之前使用的模型.

通常,当apps.py个早期信号中有from .models import SomeModels个(例如post_migrate)时,就会出现这种情况. 建议使用AppConfig.get_model(),而不是这里的classic 方式引用您的模型. 判断您的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中引入的.

Django相关问答推荐

使用override_sets构建一个预装饰的类,以更快的客户端.登录?

Django中的判断约束

django-filter compose 过滤的 url

在 Django 中按月份和年份对帖子进行分类

在Django测试get方法中获取HttpResponseNotFound

如何在视图中的 Django 重定向末尾附加字符串?

如何使用具有某些权限的 Django 组的转储数据和加载数据?

如何在 Django 模型中存储元组列表

如何将数据库中的 None 序列化为空对象?

如果一个应用程序有多个具有相同字段的模型,那么保持 DRY 的最佳实践是什么?

在 GoDaddy 上安装 django 站点

恢复 Django 1.7 RemoveField 迁移

django 管理员登录突然要求 csrf 令牌

如何判断 Python unicode 字符串是否包含非西方字母?

删除所有表的django命令是什么?

断开模型的信号并在 django 中重新连接

Django:创建索引:非唯一,多列

带有 Django 和 Python 的 Atlassian Bamboo - 可能吗?

对 django 的 Http Delete 请求返回 301

django-getlist()