在模块级

时间:2017-02-21 17:26:37

标签: python django

我制作了一个django应用程序,它设计为易于插拔,只有1个视图,1个项目计划使用该应用程序需要注意。

为方便起见,我想从应用级别提供视图和模型。所以而不是:

from mything.views import MyView
from mything.models import MyModel

你可以改为:

from mything import MyView, MyModel

我将应用中的__init__.py文件更改为:

from .views import MyView
from .models import MyModel

当然我引发旧的django.core.exceptions.AppRegistryNotReady,因为它试图在加载应用程序之前运行models.py代码。

所以我提出了以下解决方法,我想知道它是否合理使用。现在__init__.py我有:

def _expose_items():
    from .views import MyView
    from .models import MyModel
    globals()['MyView'] = MyView
    globals()['MyModel'] = MyModel

在我的应用程序的apps.py中:

from . import _expose_items

class MyThingConfig(AppConfig):
    name = 'mything'

    def ready(self):
        _expose_items()

所以现在确实可以直接从外部导入视图和模型。这有用还是可怕?

2 个答案:

答案 0 :(得分:0)

大多数Django应用程序不会将视图或模型收集到顶级模块。请参阅django.contrib.auth作为示例。

答案 1 :(得分:0)

大多数Django应用程序不会将视图或模型收集到顶级模块。使用明确的文档演示如何从您的应用程序导入。包括globals()在内的黑客可能会造成比帮助更多的麻烦。

django.contrib.auth为例。