无法从 Django 中的另一个应用程序导入模型

新手上路,请多包涵

所以我在同一个项目中运行了 2 个应用程序。

我的文件结构如下:

 /project_codebase
    /project
        __init.py
        settings.py
        urls.py
        wsgi.py
        ...
    /app1
        ...
    /app2
        ...
    manage.py

所以,出于某种奇怪的原因,我的基本目录有一个不同的名称(也就是说,它以代码库结尾)。希望这不是问题。

在我的 settings.py 中,我有这个:

 INSTALLED_APPS = [
    ...

    'app1',
    'app2',
]

好的,所以在我的 models.py(来自 app2) 中,我可以使用 from app1.models import * 轻松地从 app1 导入模型,但是,当我在我的 models.py(来自 app1) 中使用 from app2.models import * 时,我得到一个 ImportError。

有什么解决办法吗?

原文由 darkhorse 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

这可能是由于 循环导入 问题。为避免这种情况,您应该 动态加载模型

对于 最新版本的 django (1.7+) 使用 应用程序注册表

 from django.apps import apps
MyModel1 = apps.get_model('app1', 'MyModel1')

对于 早期的 django 版本(<1.7)

 from django.db.models.loading import get_model
MyModel1 = get_model('app1', 'MyModel1')

注1: 如果要定义 ForeignKey关系不需要单独的import语句。 Django 有没有介绍 过这个:

如果 app1 是一个已安装的app,你应该定义ForeignKey关系如下:

 # in app2.py
class MyModel2(models.Model):
   mymodel1 = models.ForeignKey('app1.MyModel1')

Note 2 : The get_model only works if app1 is an installed app and MyModel1 is the model you want to import from app1 .

注意 3: 尽量避免通配符导入( from ... import * ),因为 这是不好的做法

原文由 j-i-l 发布,翻译遵循 CC BY-SA 4.0 许可协议

这绝对是一个循环导入。

但我认为您需要的是将模型用作某种 RetationFields( ForeignKeyManyToManyFieldOneToOneField )参数所以你需要跳过导入并这样使用:

 # app1/models.py
class Model1(models.Model):
    relation_field = models.ForeignKey('app2.Model2')

来自 文档

如果需要在尚未定义的模型上创建关系,可以使用模型的名称,而不是模型对象本身

要引用在另一个应用程序中定义的模型,您可以明确指定一个带有完整应用程序标签的模型

只需将 str 对象作为关系字段的第一个参数,即 <app_name>.<Model_name>

注意:最好避免从模块导入所有内容( from <module_name> import *

原文由 vishes_shell 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题