在__init__.py中导入模型时出现Django 1.9弃用警告

时间:2015-11-29 09:28:27

标签: python django django-1.8

我在模块的__init__.py中声明了快捷功能,以简化导入,即。

from app.logger import log

而不是:

from app.logger.shortcuts import log

这个函数原则上是一个类对象,用这种方式像单例一样使用:

# __init_.py
from app.logger.backends import LogDatabaseBackend
log = LogDatabaseBackend()

在backends.py中我需要以这种方式导入一些模型:

# backends.py
from app.logger.models import Model1, Model2

class LogDatabaseBackend(object):
    ...

这些模型在LogDatabaseBackend的某些方法中是必需的。问题是Django会显示警告:

  

“RemovedInDjango19Warning:模型类app.logger.models.Model1没有声明显式的app_label,也没有在INSTALLED_APPS的应用程序中,或者在加载应用程序之前导入了.Digango将不再支持1.9“。

我认为原因是在加载app之前在init中导入模型。我应该如何更改代码以避免这些警告并保持Django 1.9兼容性?

2 个答案:

答案 0 :(得分:0)

<app_name>.apps.py中定义应用程序配置:

来自Application Configuration文档:

  

应用程序配置对象存储应用程序的元数据。   可以在AppConfig子类中配置某些属性。其他人是   由Django设置并且只读。

以下是documentation

中的示例
# rock_n_roll/apps.py

from django.apps import AppConfig

class RockNRollConfig(AppConfig):
    name = 'rock_n_roll'
    verbose_name = "Rock ’n’ roll"
  

默认情况下,您可以使应用程序加载此AppConfig子类   如下:

# rock_n_roll/__init__.py
default_app_config = 'rock_n_roll.apps.RockNRollConfig'
  

这会导致在RockNRollConfig时使用INSTALLED_APPS   包含'rock_n_roll'。这样您就可以使用AppConfig   功能,无需用户更新INSTALLED_APPS   设置。除了这个用例,最好避免使用   default_app_config而是指定应用程序配置类   INSTALLED_APPS,如下所述。

答案 1 :(得分:0)

如果Model1Model2ForeignKey一起使用,则您无需导入它们。而是使用ForeignKey("app.Model1", ...)。这延迟了导入到app注册表之后。否则,请考虑使用功能级别导入。