我的问题最初是由错误引发的,突出显示here。原来的问题现在已经解决了,但是这留下了一个关于如何在Python中进行导入的问题。以下是使用Django重现问题的快速步骤:
./manage.py startapp dummy_app
在app models.py
中定义一个函数和一个扩展Django模型的类,如下所示:
from django.db import models
# auxiliary function in models
def aux_function(value):
print(value)
class Report(models.Model):
class Meta:
managed = False
在新的应用模块的__init__
中,导入提到的aux_function
,如下所示:
from dummy_app.models import aux_function
INSTALLED_APPS
并运行dev server 这将导致异常:
File "/home/aanikeev/PycharmProjects/dummy/dummy_app/__init__.py", line 1, in <module>
from dummy_app.models import aux_function
File "/home/aanikeev/PycharmProjects/dummy/dummy_app/models.py", line 8, in <module>
class Report(models.Model):
File "/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site-packages/django/db/models/base.py", line 110, in __new__
app_config = apps.get_containing_app_config(module)
File "/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site-packages/django/apps/registry.py", line 247, in get_containing_app_config
self.check_apps_ready()
File "/home/aanikeev/.virtualenvs/dummy/lib/python3.5/site-packages/django/apps/registry.py", line 125, in check_apps_ready
raise AppRegistryNotReady("Apps aren't loaded yet.")
没关系,我们从文档中了解到,在Django初始化之前我们不应该使用它们导入模型或模块(参见ref 1,ref 2)。我不清楚的是为什么从模块导入函数导致在同一模块中隐式导入类(这正是发生的情况,因为所提到的异常来自 Model 元的构造函数类)?
答案 0 :(得分:5)
为了导入模块中的任何对象,必须导入并运行整个模块。 Python不区分定义和其他代码 - 所有代码都是可执行的,因此必须执行整个文件才能定义对象以便可以导入它。如果该执行包括导入其他文件的调用,那么也将执行这些导入(这有时会导致循环导入依赖性)。同样,如果模块级别的任何其他代码访问数据库,或打印到控制台,那么也将执行。