Django 1.9弃用警告app_label

Nei*_*man 59 python django deprecation-warning

我刚刚更新到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):
Run Code Online (Sandbox Code Playgroud)

现在这给我带来了3个问题.

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

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

Ant*_*wan 50

如警告中所述,这种情况发生在:

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

由于您确实在INSTALLED_APPS设置中引用了应用,因此您最有可能在应用初始化之前使用模型.

通常,当您from .models import SomeModelsapps.py早期信号中(例如post_migrate)时会发生这种情况.建议使用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)
Run Code Online (Sandbox Code Playgroud)

做这个 :

# 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)
Run Code Online (Sandbox Code Playgroud)

请注意,这个强制执行是在错误#21719中引入的.


Way*_*ind 50

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

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):
Run Code Online (Sandbox Code Playgroud)

我的解决方案是:

添加'django.contrib.sites'INSTALLED_APPS


Mar*_*air 23

我怀疑只有极少数人会看到这个错误,因为它会和我一样造成这种错误,但是如果它对其他人有帮助,似乎值得添加这个答案!

我在一次运行测试时突然发现了很多这些错误 - 事实证明,__init__.py当我的Django项目位于子目录中时,我意外地创建了一个.发生这种情况的线索是错误,如:

/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):
Run Code Online (Sandbox Code Playgroud)

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

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

rm __init__.py
rm __init__.pyc
Run Code Online (Sandbox Code Playgroud)

  • 我担心没有人解决我的问题,但这解决了! (6认同)
  • 这对我也有帮助......它影响了我模型的一个奇怪的子集,这让它变得更加不清楚.谢谢! (2认同)

Vla*_*zki 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没有声明一个明确的app_label和isn在INSTALLED_APPS中的应用程序中,或者在加载应用程序之前导入.Django 1.9将不再支持此功能.class Session(models.Model):

这是由于该INSTALLED_APPS物业的订单不良造成的settings.py.我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',
)
Run Code Online (Sandbox Code Playgroud)

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',
)
Run Code Online (Sandbox Code Playgroud)

现在我知道这可能不会直接回答你的问题,但它回答了一个相关问题,因为这是粘贴错误时谷歌上显示的唯一SO链接,我在这里已经回答了.

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

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


Jus*_*ber 8

使用app_label属性向模型添加元类.

class Meta:
    app_label = 'app_model_belongs_to'
Run Code Online (Sandbox Code Playgroud)

希望这个有效!

编辑: 原因通常是模型存在于标准位置之外.

有关更多信息,请访问:https: //docs.djangoproject.com/en/1.8/ref/models/options/#app-label

  • 临时修复不是解决方案,它只是掩盖了稍后要处理的问题. (2认同)
  • 很公平.我会继续努力寻找更好的答案.感谢您的反馈 (2认同)

Nat*_*anQ 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'
Run Code Online (Sandbox Code Playgroud)

然后,在您的应用程序__init__.py文件中,添加以下内容:

#__init__.py    
default_app_config = 'youappname.apps.YourAppNameAppConfig'
Run Code Online (Sandbox Code Playgroud)


Cau*_*ons 5

我也遇到了这个问题,它与我从应用程序加载signals.py模块的方式有关.

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

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

希望这有助于其他人!


Ром*_*ьев 5

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

/时的RuntimeError

模型类blog.models.BlogCategory不声明显式的app_label,也不在INSTALLED_APPS的应用程序中.

这有助于解决:

在blog/models.py中:

class BlogCategory(models.Model):
    some vars & methods

    class Meta:
        app_label = 'BlogCategory'
Run Code Online (Sandbox Code Playgroud)

这是100%的工作.

  • 这不能解决问题.由于文档明确指出不需要应用程序标签.我正在寻找解决这个问题的解决方案,而不是绑带 (2认同)
  • 谢谢你这个简单的解决方案 (为什么我还想要'signals.py'呢?!?:) (2认同)