Django:如何在app脚本中动态加载模型

时间:2016-12-08 04:58:43

标签: django

我的Django应用程序中有一个名为helpers.py的脚本,我无法导入模型,因为它会创建一个循环引用。

作为解决此问题的方法,我尝试在脚本中动态加载模块,如下所示:

from django.apps import apps

MyModel=apps.get_model("mymodule", "MyModel")

但是在Django加载模型并抛出错误之前会调用它。

有解决这个问题的方法吗?

理想情况下,我需要能够在Django初始化模型后创建对模型的引用,以便它在整个脚本中可用,但我不确定这是否可行。

1 个答案:

答案 0 :(得分:2)

您确定需要helpers.py内的模型吗?如果需要的东西与模型相关,请考虑将其实现为模型方法或自定义管理器。

如果您确定需要helpers.py中的模型,请查看以下示例。

正如@Selcuk所提到的,您可以在helpers.py的函数中尝试本地导入。即使helpers.py中导入了models.py,此示例也可以

# helpers.py

def foo():
    from .models import MyModel
    # do something with MyModel

helpers.py的{​​{1}}循环导入models.py的顶部,您可以导入整个models模块,而无需指定要从中导入的名称。所以下一个示例也可以

# helpers.py
import myapp.models

def foo():
    # do something with myapp.models.MyModel

但是下一个不起作用,因为我们从模块中指定了名称(可能尚未定义):

# helpers.py
from .models import MyModel
# ImportError is risen when you import a name from the module which has a circular import of this module

def foo():
    # do something with MyModel

也不起作用。它将导入模块,但是当您尝试访问名称MyModel时,您将获得NameError:

# helpers.py
from .models import *

def foo():
    # do something with MyModel
    # NameError is risen when you do something with MyModel here