【问题标题】:How to import models from one app to another app in Django?如何将模型从一个应用程序导入 Django 中的另一个应用程序?
【发布时间】:2017-09-27 09:23:35
【问题描述】:

我正在尝试在另一个应用程序的视图文件中从一个应用程序引用模型(人)。不幸的是,我收到“未解决的参考”错误。是否可以从 Django 中的其他应用程序中引用模型?如果是这样,我做错了什么?

让我用一个例子来演示:

下图显示了我的项目。我目前在名为“自动完成”的应用程序中的views.py(标记为绿色)中。我想在文件“models.py”(标记为红色)中引用一个人模型,它属于应用程序“resultregistration”。但是,我收到错误“未解析的参考人”,即使类 Person 确实存在于 models.py 中

文件 settings.py 位于 athlitikos/athlitikos - 文件夹中,而 manage.py 仅位于 athlitikos 中(如下图所示)

任何帮助将不胜感激!

编辑:我现在尝试运行“from ..resultregistration.models import Person”,因为我看到我在屏幕截图中所做的显然是错误的。但是,然后我收到错误消息“尝试相对导入超出顶级包”

感谢您的宝贵时间!

【问题讨论】:

  • 最好是复制代码而不是截图。
  • 这可能会更好,但不是投反对票的理由,问题做得很好,解释得很好
  • 我没有投反对票。我几乎从不投反对票,即使是非常糟糕的问题。顺便说一句,您可以使用命令tree 来显示目录结构。输出可以在这里发布。
  • @lapinkoira 绝对是,这些问题的格式非常明确且清晰。无论谁投反对票,请重新考虑您的行为。如果我们不尊重这项努力并阻止人们参与 SO,那将是一种耻辱。
  • 现在,更新后,我发现您将不再需要顶级目录athlitikos 中的__init__.py

标签: python django


【解决方案1】:

如果resultregistration 应用程序位于项目目录中(包含manage.py 的目录),那么您根本不应该在导入中包含项目名称athlitikos。请尝试以下操作:

from resultregistration.models import Person

【讨论】:

  • 嗨!感谢您的答复。这在 PyCharm 中有效,但是当我执行 manage.py runserver 时,出现错误:“未解析的参考结果注册”。我也试过“from ..resultregistration.models import Person”,但得到错误“尝试相对导入超出顶级包”
  • manage.pysettings.py在哪些目录?从你的截图看不清楚。
  • 我现在又加了一张截图,manage.py在athlitikos下,settings.py在athlitikos/athlitikos下
  • 恐怕不知道为什么它不适合你。特别是,我很惊讶./manage.py runserver 给出了错误unresolved reference resultregistration
  • 没关系!非常感谢您抽出宝贵的时间。此外,它可能没有多大帮助,但它不是 manage.py runserver,它会给出错误“未解决的参考结果注册”。当我写代码时,它实际上是 PyCharm
【解决方案2】:

mm 你为什么要重复 athlitikos?,尝试替换:

from athlitikos.athlitikos.resultregistration.models import Person

from resultregistration.models import Person

【讨论】:

  • 非常感谢您的回复! :D 那是因为我们的项目有一个主文件夹 athlitikos,其中有另一个文件夹 athlitikos(您在图像中看到的那个)当我按照您的建议删除一个 athlitikos 时,我收到一个新错误,说“没有名为 athlitikos 的模块.resultregistration"
  • 那么就离开吧,resultregistration,athilikos 是我想的项目名称
【解决方案3】:

从pycharm导入的时候,是从你当前文件的级别开始看的,也就是autocomplete/views.py,但是Django是从项目级别开始的,也就是你的manage.py的级别,所以可以用@ 987654323@直接。即使 pycharm 的检查会显示代码中的错误,但在您运行项目时它会通过。

【讨论】:

    【解决方案4】:

    如果我们分析您的目录树,我们可以看到:

    athlitikos
        autocomplete
            views.py
        resultregistration
            models.py
    

    autocomplete 中的views.py 中可以使用相对路径引用其他模块。试试这个:

    from ..resultregistration.models import Person
    

    第一个点上升到autocomplete,第二个点上升到athlitikos。现在,您可以从那里访问resultregistration 以及下面的所有内容。

    【讨论】:

    • 感谢您的回复!我试过了,至少它给了我另一个错误信息,“尝试相对导入超出顶级包”
    • 现在在您用另一个屏幕截图更新您的问题后,我看到athlitikos 是顶级目录。那么来自 Alasdair 和 lapinkoira 的答案应该确实有效。
    【解决方案5】:

    我认为它会起作用:

    from athlitikos.resultregistration.models import Person
    

    【讨论】:

    • 非常感谢您的回复!我试过这样做,但不幸的是得到了错误:ModuleNotFoundError: No module named 'athlitikos.resultregistration
    【解决方案6】:

    resultregistration.models 应该这样做。只需确保将应用添加到 settings.py 中已安装的应用即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-03
      • 2011-12-22
      • 1970-01-01
      • 2017-10-06
      • 1970-01-01
      相关资源
      最近更新 更多