【问题标题】:PyCharm cannot resolve reference in __init__.py with Django project appsPyCharm 无法使用 Django 项目应用程序解析 __init__.py 中的引用
【发布时间】:2017-11-12 06:09:27
【问题描述】:

我对这个问题束手无策,希望得到一些帮助来解决这个问题。

我有一个 Django 项目,里面有很多子应用:

my_project/
    manage.py
    my_project/
        settings.py
        urls.py
        wsgi.py
    app_root/
        __init__.py
        app1/
            __init__.py
            models.py
            views.py
            urls.py
            templates/
                [various templates].html
        app2/
            __init__.py
            models.py
            [etc]
        app3/
            [etc]

在我的 django settings.py 中,我已经安装了这样的应用程序:

app_root.app1,
app_root.app2,

在 PyCharm 中,我尝试了各种方法,但基本上将 Content Root 作为顶部的“my_project/”,并将 app_root、app1、app2 等作为 Source Root。我试过只将app_root 作为唯一的源根,我也试过只将app1app2 等作为源根,但没有任何区别。

一切正常。应用程序运行和一切。但是,PyCharm 无法解析我的应用程序。

但是,如果我尝试这个:

import app_root
...
def some_function(self):
    app_root.app1.models.My_Model.objects.all()

它将突出显示 app1 并显示错误“在 'init.py' 中找不到引用 'app1'” 这也意味着它在执行app_root.app1. 时无法在路径中的任何位置执行自动完成 - 尽管每个目录中都有(空的)__init__.py,但它不知道模型、视图等。

我也不能使用任何重构,因为它总是说“函数不在源根目录下”

我花了无数个小时试图让 PyC​​harm 正常运行,但根本找不到方法。有什么办法可以做到这一点,以便 PyCharm 自动完成我的应用程序而不是继续发出检查警告?

【问题讨论】:

    标签: django pycharm


    【解决方案1】:

    我有一些类似的问题。我的解决方案;在 PyCharm 首选项中,我在活动的 Python 解释器中添加了一条到 app_root 的路径。

    【讨论】:

    • 感谢您的评论。我有app_root 和所有标识为“源根”的应用程序,并且还选择了“将源根添加到 PYTHONPATH”。我看不到任何其他将app_root 添加到我的 Python 解释器的方法(它似乎只允许在 Python 解释器设置下安装包)
    • 刚刚更新了最新的 PyCharm 版本,显然 Interperter 有一些变化。他们消除了为您的interperter添加路径的可能性。目前我只将app_root 定义为源文件夹,还不知道这是否是解决方案。
    【解决方案2】:

    在与 PyCharm 人员交流后,我了解到以下内容:

    Django 出于自己的目的使用__import__ 导入变量INSTALLED_APPS 中的所有应用程序及其模型。 在你的情况下,它运行

    __import__("app_root.app1")
    __import__("app_root.app1.models")
    

    之后,调用import app_root 并获取模块app_root,其中app_root.app1app_root.app1.models 已由内部Django 代码导入

    Django 导入应用程序和模型的事实是 Django 内部的,它没有文档记录,并且可能在未来的版本中更改。我们认为您不应该在生产代码中依赖它,PyCharm 也不应该。

    这是裸 python 中的示例(没有 django):

    __import__("encodings.ascii")
    import encodings
    print (encodings.ascii.Codec) # this code works, but PyCharm marks "ascii" as "unknown module"
    

    所以基本上,它不应该像import app_root 那样工作,但 Django 的时髦掩盖了这一点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-27
      • 2014-02-11
      • 1970-01-01
      • 2017-05-21
      • 2019-09-10
      • 2019-08-20
      • 2020-04-13
      相关资源
      最近更新 更多